Go-lang结构/范围

时间:2013-09-19 21:25:14

标签: go

示例代码(已编辑的代码段):http://play.golang.org/p/eZV4WL-4N_

为什么会这样?

for x, _ := range body.Personality {
    body.Personality[x].Mutate()
}

成功地改变了结构的内容,但是

for _, pf := range body.Personality{
    pf.Mutate()
}

没有? 该范围是否会为其迭代的每个项目创建新实例?因为结构实际上确实是变异的,但它不会持续存在。

2 个答案:

答案 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)。这样,循环中的赋值只需要一个指向结构的指针,允许你修改它。