附加内容以切片到嵌套结构中不起作用

Append content to slice into a nested struct does not work

我有两个这样的嵌套结构:

type Block struct {
    ID       string
    Contents []string
}

type Package struct {
    Name   string
    Blocks []Block
}

当我尝试在特定块中附加新内容时,原始包 (p) 没有改变。

for _, b := range p.Blocks {
    if b.ID == "B1" {
        fmt.Println("Adding a new content")
        b.Contents = append(b.Contents, "c3")
    }
}

示例:

https://play.golang.org/p/5hm6RjPFk8o

当您遍历切片时,从切片中检索到的每个单独值都是切片中相应元素的副本。所以要修改切片中的元素,而不是复制,您可以直接使用索引表达式访问元素。或者你可以使用指针。注意,指针也被复制,但复制的指针将指向与切片中元素相同的地址,因此可用于直接修改相同的数据。


您可以使用索引:

for i := range p.Blocks {
    if p.Blocks[i].ID == "B1" {
        fmt.Println("Adding a new content")
        p.Blocks[i].Contents = append(p.Blocks[i].Contents, "c3")
    }
}

https://play.golang.org/p/di175k18YQ9


或者你可以使用指针:

type Block struct {
    ID       string
    Contents []string
}

type Package struct {
    Name   string
    Blocks []*Block
}

for _, b := range p.Blocks {
    if b.ID == "B1" {
        fmt.Println("Adding a new content")
        b.Contents = append(b.Contents, "c3")
    }
}

https://play.golang.org/p/1RjWlCZkhYv

发生这种情况是因为这一行:

for _, b := range p.Blocks {

为切片中的每个 Block 创建一个 copy。因此,当您随后在循环体中进行更改时,您会将它们更改为 Block 的副本,而不是切片中的 Block

如果您改为使用索引获取指向每个 Block 的指针,例如

for i := range p.Blocks {
    b := &p.Blocks[i]

它按预期工作:

https://play.golang.org/p/h_nXEX9oWRT