声明数组大小是否明确确定按值传递还是按引用传递?
Does declaring an array size explicitly determine pass by value vs reference?
以不改变其父数组的数组副本为例:
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 的行为会因另一个变量的声明方式而完全不同?我很困惑哈哈。
我强烈建议阅读 Go 博客 post Arrays, slices and strings - 然后再读一遍 - 它包含许多其他微妙的副作用。
它将显示幕后发生的事情以及切片类型的表示方式:
sliceHeader{
Length: 0,
Capacity: 0,
ZerothElement: nil, // points to a fixed size array
}
以及变异操作如何影响多个切片值。
最终引述:
Arrays have their place—they are a good representation of a
transformation matrix for instance—but their most common purpose in Go
is to hold storage for a slice.
以不改变其父数组的数组副本为例:
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 的行为会因另一个变量的声明方式而完全不同?我很困惑哈哈。
我强烈建议阅读 Go 博客 post Arrays, slices and strings - 然后再读一遍 - 它包含许多其他微妙的副作用。
它将显示幕后发生的事情以及切片类型的表示方式:
sliceHeader{
Length: 0,
Capacity: 0,
ZerothElement: nil, // points to a fixed size array
}
以及变异操作如何影响多个切片值。
最终引述:
Arrays have their place—they are a good representation of a transformation matrix for instance—but their most common purpose in Go is to hold storage for a slice.