2 回答
TA贡献1863条经验 获得超2个赞
发生这种情况是因为以下行:
for _, b := range p.Blocks {创建切片中每个副本的副本。因此,当您在循环体中进行更改时,您将对 的副本进行更改,而不是对切片中的 进行更改。BlockBlockBlock
如果您改用索引来获取指向每个 的指针,例如Block
for i := range p.Blocks {
b := &p.Blocks[i]它按预期工作:
https://play.golang.org/p/h_nXEX9oWRT
TA贡献1839条经验 获得超15个赞
在切片上循环时,从切片中检索到的每个单个值都是切片中相应元素的副本。因此,要修改切片中的元素,而不是副本,可以使用索引表达式直接访问元素。或者您可以使用指针。请注意,也会复制指针,但复制的指针将指向与切片中的元素相同的地址,因此可用于直接修改相同的数据。
您可以使用索引:
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
- 2 回答
- 0 关注
- 201 浏览
添加回答
举报
