1 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊
問題是您正在使用for _, i := range循環(huán),并且您在循環(huán)內(nèi)修改了循環(huán)變量:
for _, i := range params.Parameters {
switch i.Attached {
case false:
// ...
i.SetScript(string(reader))
}
}
循環(huán)變量i是您范圍內(nèi)的切片元素的副本。因此,如果您對(duì)其進(jìn)行任何修改,您只會(huì)修改副本,而不是切片中的元素。(請(qǐng)注意,該SetScript()方法確實(shí)有一個(gè)指針接收器,但它會(huì)接收副本的地址,因此它可以并且只會(huì)修改副本。)
一種解決方法是使用 index-only range,并使用索引引用切片元素(將所有出現(xiàn)的地方替換為i)params.Parameters[i]:
for i := range params.Parameters {
switch params.Parameters[i].Attached {
case false:
// ...
params.Parameters[i].SetScript(string(reader))
}
}
您可以通過將切片分配給局部變量來簡(jiǎn)化上面的代碼(這將只復(fù)制切片頭而不是其元素,并且它將引用相同的底層數(shù)組),并使用if語(yǔ)句而不是那個(gè)丑陋的switch:
p := params.Parameters
for i := range p {
if !p[i].Attached {
// ...
p[i].SetScript(string(reader))
}
}
另一種簡(jiǎn)化/改進(jìn)是獲取索引表達(dá)式的地址,并使用它(因此您可以省略多次重復(fù)):
for i := range params.Parameters {
p := ¶ms.Parameters[i]
if !p.Attached {
// ...
p.SetScript(string(reader))
}
}
- 1 回答
- 0 關(guān)注
- 110 瀏覽
添加回答
舉報(bào)