更改数组元素没有效果

编译器有问题或者我对Go的理解有问题。我有一个奇怪的错误,并将其简化为一个简单的示例。由于某种原因,我无法直接在循环内更改数组。


    var nums [2]int

    for i, v := range nums {

        if i == 0 {

            nums[i+1]++

        } else {

            fmt.Print(v)

        }

    }

这会增加 nums[1] 然后打印它。所以它应该打印 1,但它打印 0。


森栏
浏览 99回答 2
2回答

GCT1015

当您在表达式中使用数组时,您将获得它的“值”(即数组的完整新副本)。这包括在循环的范围表达式中使用数组。因此,当您打印时,v您正在打印副本,但实际的nums数组已更改。在切片而不是数组上循环可以满足您的期望:    var nums [2]int    for i, v := range nums[:] {        if i == 0 {            nums[i+1]++        } else {            fmt.Print(v)        }    }

catspeake

范围创建数组(及其值)的副本,因此可以迭代它们。如果您计划在迭代期间改变数组(或其中的一个切片),最好直接引用数组/切片 - 因为该值将是一个v副本,并且在您的代码中是数组的旧副本。所以尝试这样的事情:var nums [2]intfor i := range nums {    if i == 0 {        nums[i+1]++    } else {        fmt.Print(nums[i])    }}
打开App,查看更多内容
随时随地看视频慕课网APP