如何使用 * 指针将数据附加到数组结构

How do you append data to array struct with * pointer

我正在学习 golang 的基础知识,我偶然发现了一些我可能缺乏理解的东西,这段代码工作正常:

package main

import (
    "fmt"
)

type Category struct {
    Id   int
    Name string
}

type Book struct {
    Id         int
    Name       string
    Categories []Category
}

func main() {

    var book Book

    book.Id = 1
    book.Name = "Vanaraj"

    for i := 0; i < 10; i++ {
        book.Categories = append(book.Categories, Category{
            Id:   10,
            Name: "Vanaraj",
        })
    }

    fmt.Println(book)

}

Output:
{1 Vanaraj [{10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj} {10 Vanaraj}]}

但是在 [] 类别上添加 * 指针会破坏程序

package main

import (
    "fmt"
)

type Category struct {
    Id   int
    Name string
}

type Book struct {
    Id         int
    Name       string
    Categories *[]Category
}

func main() {

    var book Book

    book.Id = 1
    book.Name = "Vanaraj"

    for i := 0; i < 10; i++ {
        book.Categories = append(book.Categories, Category{
            Id:   10,
            Name: "Vanaraj",
        })
    }

    fmt.Println(book)

}

Output:
./prog.go:26:27: first argument to append must be slice; have *[]Category

现在假设我无法从第二个代码块的 []Category 中删除 *(案例是导入一个包),我如何仍然像代码的第一个块一样附加数据,只添加我的 main() 函数的代码?
提前致谢

这与使用 int 值或 *int 指针相同。

var p *int

你必须先初始化它,例如使用内置 new():

p = new(int)

您分配给指向的值:

*p = 3
fmt.Println(*p)

指针切片也是如此:您首先必须对其进行初始化,例如使用内置 new():

book.Categories = new([]Category)

并且您使用 *:

取消引用指针
*book.Categories = append(*book.Categories, Category{
    Id:   10,
    Name: "Vanaraj",
})

Go Playground 上试用。

请注意切片是切片 headers,它已经包含一个指向后备数组的指针。所以使用指向切片的指针是非常罕见的,通常是不需要的,只会使事情复杂化。

func main() {

var book Book

book.Id = 1
book.Name = "Vanaraj"
book.Categories = new([]Category)

for i := 0; i < 10; i++ {
    *book.Categories = append(*book.Categories, Category{
        Id:   10,
        Name: "Vanaraj",
    })
}

fmt.Println(book)}

输出:{1 Vanaraj 0xc00000c030}

要打印类别,您可以使用 fmt.Println(book.Categories)