编译器有问题或者我对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 关注
- 133 浏览
添加回答
举报
0/150
提交
取消