【发布时间】:2020-11-08 07:54:37
【问题描述】:
以不改变其父数组的数组副本为例:
a1 := [5]string{"English", "Japanese", "Spanish", "French", "Hindi"}
a2 := a1
fmt.Println("a1 = ", a1) //[English Japanese Spanish French Hindi]
fmt.Println("a2 = ", a2) //[English Japanese Spanish French Hindi]
a2[1] = "German"
fmt.Println("now a2 = ", a2) // [English German Spanish French Hindi]
fmt.Println("and a1 = ", a1) // [English Japanese Spanish French Hindi]
毫不奇怪,a2 是副本,而不是参考。更改副本不应该更改另一个副本,它们保存在不同的地址。
现在看看如果我们不向 a1 声明大小会发生什么:
a1 := []string{"English", "Japanese", "Spanish", "French", "Hindi"} // <--difference here
a2 := a1
fmt.Println("a1 = ", a1) //[English Japanese Spanish French Hindi]
fmt.Println("a2 = ", a2) //[English Japanese Spanish French Hindi]
a2[1] = "German"
fmt.Println("now a2 = ", a2) // [English German Spanish French Hindi]
fmt.Println("and a1 = ", a1) // [English German Spanish French Hindi]
当 a2 改变时两者都改变?!所以,如果你没有为数组声明一个大小,然后将它分配给某个东西,突然它是一个引用?为什么 a2 := a1 的行为会完全不同,具体取决于另一个变量的声明方式?我很困惑哈哈。
【问题讨论】:
-
当你不声明大小时,它是一个slice,而不是一个数组,虽然是一个相关的东西,但它是完全不同的。
-
该死的,这很微妙
-
Go 总是通过值传递,从不通过引用。
标签: arrays go pass-by-reference