示例代码(编辑后的代码片段):http://play.golang.org/p/eZV4WL-4N_
为什么会这样
for x, _ := range body.Personality {
body.Personality[x].Mutate()
}
成功地改变了结构的内容,但是
for _, pf := range body.Personality{
pf.Mutate()
}
不是吗? range 是否会为其迭代的每个项目创建新实例?因为该结构实际上会发生变化,但不会持续存在。
最佳答案
range
关键字复制数组的结果,因此无法更改
使用范围值的内容。您必须使用索引或指针 slice 而不是值
如果你想改变原始数组/slice 。
规范涵盖了此行为,如here所述。关键是分配线
x := a[i]
将值 a[i]
复制到 x
,因为它不是指针。由于 range
被定义为使用
a[i]
,值被复制。
关于for-loop - 在范围循环中调用结构体方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18905187/