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 關注
- 116 瀏覽
添加回答
舉報