func ChangeArray(s [3]string) {
s[1] = "bob"
}
func ChangeSlice(s []string) {
s[1] = "bob"
}
func main() {
name := [3]string{"eighty", "don", "jean"}
ChangeArray(name)
name_s := []string{"eighty", "don", "jean"}
ChangeSlice(name_s)
fmt.Println(name)
fmt.Println(name_s)
}
输出:
[eighty don jean]
[eighty bob jean]
这表明对于传参拷贝的副本来说,数组的副本是真的副本,而切片的副本要么是指针要么是类似于引用的东西。
看了一下 go语言圣经(图文全部摘自该书,侵删)
一个slice是一个轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能,而且slice的底层确实引用一个数组对象。一个slice由三个部分构成:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址。
所以,slice 的拷贝其实是 c++ 中的指针传参。
这就解释为什么 sort.Sort() 方法的基础结构要定义成切片类型,而非其他类型。