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 关注
- 110 浏览
添加回答
举报