2 回答

TA貢獻(xiàn)1863條經(jīng)驗 獲得超2個贊
發(fā)生這種情況是因為以下行:
for _, b := range p.Blocks {
創(chuàng)建切片中每個副本的副本。因此,當(dāng)您在循環(huán)體中進(jìn)行更改時,您將對 的副本進(jìn)行更改,而不是對切片中的 進(jìn)行更改。Block
Block
Block
如果您改用索引來獲取指向每個 的指針,例如Block
for i := range p.Blocks { b := &p.Blocks[i]
它按預(yù)期工作:
https://play.golang.org/p/h_nXEX9oWRT

TA貢獻(xiàn)1839條經(jīng)驗 獲得超15個贊
在切片上循環(huán)時,從切片中檢索到的每個單個值都是切片中相應(yīng)元素的副本。因此,要修改切片中的元素,而不是副本,可以使用索引表達(dá)式直接訪問元素。或者您可以使用指針。請注意,也會復(fù)制指針,但復(fù)制的指針將指向與切片中的元素相同的地址,因此可用于直接修改相同的數(shù)據(jù)。
您可以使用索引:
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 關(guān)注
- 116 瀏覽
添加回答
舉報