2 回答

TA貢獻1876條經驗 獲得超6個贊
for i := range items {
alter(&items[i])
}
或
items := []*Item{{0}, {1}}
for _, item := range items {
alter(item)
}
您的版本不起作用的原因是,迭代變量在切片中保存元素的副本,這意味著您正在修改的是副本而不是原始副本。如果您運行以下命令,您可以看到它們是內存中的獨立對象:https://play.golang.org/p/vr9CfX0WQcBitem

TA貢獻1780條經驗 獲得超5個贊
參考:https://tour.golang.org/moretypes/16
for 循環的范圍形式在切片或映射上迭代。
在切片上劃過范圍時,每次迭代都會返回兩個值。第一個是索引,第二個是該索引處元素的副本。
所以
for i, x := range arr {
// x is copy for arr[i]
}
因此,我們將直接使用相同的地址并將其傳遞給函數,以便可以對其進行修改。arr[i]alter
示例代碼:
package main
import "fmt"
type Item struct {
Value int
}
func alter(t *Item) {
(*t).Value = 100
}
func main() {
items := []Item{{0}, {1}}
for i := range items {
alter(&items[i])
}
fmt.Println(items)
}
- 2 回答
- 0 關注
- 100 瀏覽
添加回答
舉報