在go语言里面数组和切片是两个重要类型的数据类型,那么他们的区别在于,[具体的数字]就是数组,否则就是切片。其实他们之间有一个质的区别,数组作为参数是一个值传递,切片作为参数是一个引用传递。
切片的扩展
切片的扩展是一个很搅的概念,我们一般在初始化切片的时候,会有两个参数,一个是长度,一个是容量,只要知道这个概念,那么切片的扩展就很好理解,而且需要我们注意的是,切片是向后扩展,不能向前扩展
我们同个一个列子来说明切片的扩展:
arr := [...]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6]
s2 := s1[3:5]
对于以上的列子,大家可能想到的是s2长度一共4,怎么可能取到5呢,会不会报错呢?我的答案是不会报错的,其中的原理,我们下图拆解:
s1和s2的最大容量就是底层数组的长度,如果超过了这个长度,那么程序就会报错;
对于s1来说他的长度就是4,但是容量是6;对于s2来说长度是2,容量是3原因在于s2是对于s1来说的,s2的取值对于底层数组来说就是5和6。