Go 数组值传递谜团:为什么修改数组副本不影响原始数组?

go 数组值传递谜团:为什么修改数组副本不影响原始数组?

go数组值传递谜团

在go中,数组是一种值类型,这意味着对数组的赋值将创建数组的副本。然而,在一个特定的例子中,对数组副本的修改似乎没有影响到原始数组,这令人困惑。

考虑以下代码:

package main

import (
    "fmt"
)

func main() {
    a := [3]int{1, 2, 3}
    a2 := a

    for i := range a2 {
        a2[i] = 0
    }
    
    fmt.println(a) // 输出结果为什么是[1 2 3]
}

在这段代码中,我们创建一个长度为3的数组a,并将其赋值给另一个变量a2。然后,我们遍历a2并将其所有元素设置为0。

令人惊讶的是,当我们打印a时,它仍然包含原始值[1, 2, 3]。这意味着对a2的修改没有影响到a。

这是因为a2 := a执行了一个值拷贝。这意味着a2是一个a的新副本。对a2的任何修改都不会影响到a,反之亦然。

如果你希望a2引用a而不是创建副本,可以执行以下操作:

a2 := a[:]

使用冒号切片语法,a2现在引用a而不是创建副本。这意味着对a2的任何修改也将反映在a中。

在上面的例子中,如果我们使用冒号切片语法,那么a将会输出[0, 0, 0],因为a2的修改反映到了a中。

以上就是Go 数组值传递谜团:为什么修改数组副本不影响原始数组?的详细内容,更多请关注其它相关文章!