附加内容以切片到嵌套结构中不起作用
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")
}
}
示例:
当您遍历切片时,从切片中检索到的每个单独值都是切片中相应元素的副本。所以要修改切片中的元素,而不是复制,您可以直接使用索引表达式访问元素。或者你可以使用指针。注意,指针也被复制,但复制的指针将指向与切片中元素相同的地址,因此可用于直接修改相同的数据。
您可以使用索引:
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")
}
}
发生这种情况是因为这一行:
for _, b := range p.Blocks {
为切片中的每个 Block
创建一个 copy。因此,当您随后在循环体中进行更改时,您会将它们更改为 Block
的副本,而不是切片中的 Block
。
如果您改为使用索引获取指向每个 Block
的指针,例如
for i := range p.Blocks {
b := &p.Blocks[i]
它按预期工作:
我有两个这样的嵌套结构:
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")
}
}
示例:
当您遍历切片时,从切片中检索到的每个单独值都是切片中相应元素的副本。所以要修改切片中的元素,而不是复制,您可以直接使用索引表达式访问元素。或者你可以使用指针。注意,指针也被复制,但复制的指针将指向与切片中元素相同的地址,因此可用于直接修改相同的数据。
您可以使用索引:
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")
}
}
发生这种情况是因为这一行:
for _, b := range p.Blocks {
为切片中的每个 Block
创建一个 copy。因此,当您随后在循环体中进行更改时,您会将它们更改为 Block
的副本,而不是切片中的 Block
。
如果您改为使用索引获取指向每个 Block
的指针,例如
for i := range p.Blocks {
b := &p.Blocks[i]
它按预期工作: