編譯器有問題或者我對Go的理解有問題。我有一個奇怪的錯誤,并將其簡化為一個簡單的示例。由于某種原因,我無法直接在循環內更改數組。 var nums [2]int for i, v := range nums { if i == 0 { nums[i+1]++ } else { fmt.Print(v) } }這會增加 nums[1] 然后打印它。所以它應該打印 1,但它打印 0。
2 回答

GCT1015
TA貢獻1827條經驗 獲得超4個贊
當您在表達式中使用數組時,您將獲得它的“值”(即數組的完整新副本)。這包括在循環的范圍表達式中使用數組。因此,當您打印時,v您正在打印副本,但實際的nums數組已更改。
在切片而不是數組上循環可以滿足您的期望:
var nums [2]int
for i, v := range nums[:] {
if i == 0 {
nums[i+1]++
} else {
fmt.Print(v)
}
}

catspeake
TA貢獻1111條經驗 獲得超0個贊
范圍創建數組(及其值)的副本,因此可以迭代它們。
如果您計劃在迭代期間改變數組(或其中的一個切片),最好直接引用數組/切片 - 因為該值將是一個v副本,并且在您的代碼中是數組的舊副本。
所以嘗試這樣的事情:
var nums [2]int
for i := range nums {
if i == 0 {
nums[i+1]++
} else {
fmt.Print(nums[i])
}
}
- 2 回答
- 0 關注
- 178 瀏覽
添加回答
舉報
0/150
提交
取消