2 回答

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

TA貢獻1839條經(jīng)驗 獲得超15個贊
在切片上循環(huán)時,從切片中檢索到的每個單個值都是切片中相應(yīng)元素的副本。因此,要修改切片中的元素,而不是副本,可以使用索引表達式直接訪問元素?;蛘吣梢允褂弥羔槨U堊⒁?,也會復(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)注
- 108 瀏覽
添加回答
舉報