将内容附加到嵌套结构中不起作用

Amp*_*aro -5 struct append go slice

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

type Block struct {
    ID       string
    Contents []string
}

type Package struct {
    Name   string
    Blocks []Block
}
Run Code Online (Sandbox Code Playgroud)

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

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

例子:

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

CAF*_*FxX 5

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

for _, b := range p.Blocks {
Run Code Online (Sandbox Code Playgroud)

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

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

for i := range p.Blocks {
    b := &p.Blocks[i]
Run Code Online (Sandbox Code Playgroud)

它按预期工作:

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