示例代码(已编辑的代码段):http://play.golang.org/p/eZV4WL-4N_
为什么会这样?
for x, _ := range body.Personality {
body.Personality[x].Mutate()
}
成功地改变了结构的内容,但是
for _, pf := range body.Personality{
pf.Mutate()
}
没有? 该范围是否会为其迭代的每个项目创建新实例?因为结构实际上确实是变异的,但它不会持续存在。
答案 0 :(得分:2)
range
关键字复制数组的结果,因此无法更改数组
使用范围值的内容。您必须使用索引或指针切片而不是值
如果你想改变原始数组/切片。
此行为由规范here所涵盖。关键在于分配线
x := a[i]
将值a[i]
复制到x
,因为它不是指针。由于range
被定义为使用
a[i]
,复制值。
答案 1 :(得分:1)
你的第二个循环大致相当于:
for x := range body.Personality {
pf := body.Personality[x]
pf.Mutate()
}
由于body.Personality
是一个结构数组,因此对pf
的赋值会生成结构的副本,这就是我们所说的Mutate()
。
如果你想以你在例子中的方式对数组进行范围调整,一个选项是使它成为一个指向结构的指针数组(即[]*PFile
)。这样,循环中的赋值只需要一个指向结构的指针,允许你修改它。