golang-切片与数组的区别理解
接触golang有一年多了,很长一段时间对数据和切片的理解都模模糊糊,到今天为止总结一下自己对数组和切片理解。
数组
在go中,数组是一种值类型。虽然数组的元素可以被修改,但数组本身的赋值和传参都是以整体赋值的方式进行的。数组由长度,容量和数据组成,这也是为什么不同长度,但数据类型相同的数组在go中不能互相赋值的原因,因为它们的长度不同(比如:[2]int,[3]int这两种类型),此外它们的指针类型也是不相同的(*[2]int, [3]int)。
切片
切片的底层也是对应类型的数组组成,但切片还有独立的长度和容量信息。切片的传值也只是把切片的头部分信息按值传递,因为切片的头含有底层数据的指针,所以它的赋值不会导致底层数据的复制。在go中除了闭包对外部变量的访问是按引用访问外,其它的赋值和传参都是按值传递的方式进行的。切片在函数传递时,只复制了切片的底层数据的对应的指针,并没有传递切片的容量和长度信息,如果只是修改切片某个位置的值,那么外部切片变量也会同步修改,因为引用的底层的数据都是一样的。但是在函数中如果切片的长度或者容量改变了,这是不会影响到函数外部的切片变量的。但这也是为什么内置函数append会返回一个新切片的原因,因为append经常涉及到切片的扩容。
golang-切片与数组的区别理解