Arrays Golang中的数组分配:内容复制或内容指针复制

Arrays Golang中的数组分配:内容复制或内容指针复制,arrays,go,Arrays,Go,在学习Golang中数组数据结构的细微差别时,我遇到了一个有趣的困惑。我从中吸取了教训- 分配或传递数组值时,您将 复制它的内容 为了亲自检查这一点,我编写了以下代码: package main import "fmt" func main() { x := []int{2, 4, 5} y := x y[0] = -10 // expecting 2 here but getting -10, since y := x is supposed to b

在学习Golang中数组数据结构的细微差别时,我遇到了一个有趣的困惑。我从中吸取了教训-

分配或传递数组值时,您将 复制它的内容

为了亲自检查这一点,我编写了以下代码:

package main

import "fmt"

func main() {
    x := []int{2, 4, 5}
    y := x

    y[0] = -10

    // expecting 2 here but getting -10, since  y := x is supposed to be a content copy
    fmt.Println(x[0])

    // not same
    println("&x: ", &x)
    println("&y: ", &y)

    // same
    println("&x[0]: ", &x[0])
    println("&y[0]: ", &y[0])
}
在Java中执行完全相同的操作时,我得到了与预期相同的x和y的内部对象地址

Go代码:

Java代码:

您的
x

x := []int{2, 4, 5}
是一个,不是一个

如果将
x
设置为数组:

x := [3]int{2, 4, 5}
// ---^ Now it is an array
然后,您将看到预期的结果:

package main

import "fmt"

func main() {
    x := [3]int{2, 4, 5}
    y := x

    y[0] = -10

    // expecting 2 here, since it is supposed to be a content copy
    fmt.Println(x[0])

    // not same
    fmt.Println("&x: ", &x)
    fmt.Println("&y: ", &y)

    // same (not anymore...)
    fmt.Println("&x[0]: ", &x[0])
    fmt.Println("&y[0]: ", &y[0])
}
产生如下输出:

2
&x:  &[2 4 5]
&y:  &[-10 4 5]
&x[0]:  0x10414020
&y[0]:  0x10414030

您的
x

x := []int{2, 4, 5}
是一个,不是一个

如果将
x
设置为数组:

x := [3]int{2, 4, 5}
// ---^ Now it is an array
然后,您将看到预期的结果:

package main

import "fmt"

func main() {
    x := [3]int{2, 4, 5}
    y := x

    y[0] = -10

    // expecting 2 here, since it is supposed to be a content copy
    fmt.Println(x[0])

    // not same
    fmt.Println("&x: ", &x)
    fmt.Println("&y: ", &y)

    // same (not anymore...)
    fmt.Println("&x[0]: ", &x[0])
    fmt.Println("&y[0]: ", &y[0])
}
产生如下输出:

2
&x:  &[2 4 5]
&y:  &[-10 4 5]
&x[0]:  0x10414020
&y[0]:  0x10414030

非常感谢您!非常感谢你!