1

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

为什么会这样

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

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

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

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

4

2 回答 2

2

关键字复制数组的range结果,因此无法使用 range 的值更改内容。如果要更改原始数组/切片,则必须使用索引或指针切片而不是值。

此处所述的规范涵盖了此行为。关键是赋值行将 x := a[i]值复制a[i]到,x因为它不是指针。由于range定义为 use a[i],因此值被复制。

于 2013-09-19T21:27:50.570 回答
1

您的第二个循环大致相当于:

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

因为body.Personality是一个结构数组,所以赋值为结构pf的副本,这就是我们所调用Mutate()的。

如果您想以示例中的方式对数组进行范围划分,一种选择是使其成为指向结构的指针数组(即[]*PFile)。这样,循环中的赋值将只需要一个指向结构的指针,允许您对其进行修改。

于 2013-09-20T01:10:56.317 回答