天天看点

Go 语言中切片和数组的区别

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元素对应的底层数组元素的地址。

Go 语言中切片和数组的区别

所以,slice 的拷贝其实是 c++ 中的指针传参。

这就解释为什么 sort.Sort() 方法的基础结构要定义成切片类型,而非其他类型。