为了账号安全,请及时绑定邮箱和手机立即绑定

更改数组元素没有效果

更改数组元素没有效果

Go
森栏 2023-07-17 17:51:27
编译器有问题或者我对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)

        }

    }


查看完整回答
反对 回复 2023-07-17
?
catspeake

TA贡献1111条经验 获得超0个赞

范围创建数组(及其值)的副本,因此可以迭代它们。


如果您计划在迭代期间改变数组(或其中的一个切片),最好直接引用数组/切片 - 因为该值将是一个v副本,并且在您的代码中是数组的旧副本。


所以尝试这样的事情:


var nums [2]int

for i := range nums {

    if i == 0 {

        nums[i+1]++

    } else {

        fmt.Print(nums[i])

    }

}


查看完整回答
反对 回复 2023-07-17
  • 2 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信