1 回答
TA贡献1824条经验 获得超6个赞
问题是您正在使用for _, i := range循环,并且您在循环内修改了循环变量:
for _, i := range params.Parameters {
switch i.Attached {
case false:
// ...
i.SetScript(string(reader))
}
}
循环变量i是您范围内的切片元素的副本。因此,如果您对其进行任何修改,您只会修改副本,而不是切片中的元素。(请注意,该SetScript()方法确实有一个指针接收器,但它会接收副本的地址,因此它可以并且只会修改副本。)
一种解决方法是使用 index-only range,并使用索引引用切片元素(将所有出现的地方替换为i)params.Parameters[i]:
for i := range params.Parameters {
switch params.Parameters[i].Attached {
case false:
// ...
params.Parameters[i].SetScript(string(reader))
}
}
您可以通过将切片分配给局部变量来简化上面的代码(这将只复制切片头而不是其元素,并且它将引用相同的底层数组),并使用if语句而不是那个丑陋的switch:
p := params.Parameters
for i := range p {
if !p[i].Attached {
// ...
p[i].SetScript(string(reader))
}
}
另一种简化/改进是获取索引表达式的地址,并使用它(因此您可以省略多次重复):
for i := range params.Parameters {
p := ¶ms.Parameters[i]
if !p.Attached {
// ...
p.SetScript(string(reader))
}
}
- 1 回答
- 0 关注
- 144 浏览
添加回答
举报
