以数组副本不改变其父数组为例:
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的行为完全不同,这取决于声明另一个变量的方式?我很困惑,哈哈。
答案 0 :(得分:1)
我强烈建议您阅读Go博客文章Arrays, slices and strings-然后再次阅读-该文章还包含许多其他细微的副作用。
它将显示引擎盖下发生的情况以及如何表示切片类型:
sliceHeader{
Length: 0,
Capacity: 0,
ZerothElement: nil, // points to a fixed size array
}
以及变异操作如何影响一个以上的分片值。
最后报价:
数组有其位置-它们很好地表示了 例如转换矩阵-但它们在Go中最常见的目的 是要保留一片的存储空间。