1.简介
slice:切片。依托数组实现,可粗线理解为动态数组。相对比于一般数组,可更方便的进行扩容等操作。
2 slice实现
2.1 slice数据结构
type slice struct { array unsafe.Pointer len int cap int }
array指针指向底层数组,len表示切片长度,cap表示底层数组容量。
2.2 make创建slice
slice := make([]int, 5, 10)
所创建Slice
该Slice长度为5,即可以使用下标slice[0] ~ slice[4]来操作里面的元素,此时对此slice元素进行操作,只能操作下标0~4,否则下标超出范围。cap为10,表示后续向slice添加新的元素时可以不必重新分配内存,直接使用预留内存即可。
2.3 通过数组创建slice
通过数组创建slice时,slice会与数组共享一部分内存
slice := array[5:7]
所创建的Slice,结构如下图所示:
切片从数组array[5]开始,到数组array[7]结束(不含array[7]),即切片长度为2,数组后面的内容都作为切片的预留内存,即capacity为5。
2.4 slice扩容
通过append向slice添加元素时,如果slice预留内存空间足够,则直接添加,对应长度变长。如果slice预留内存空间不足,则slice重新分配一个更大的内存,原slice的数据copy进新slice,新元素进行添加,对应长度变长,返回新slice。
slice扩容原则:
slice容量小于1024,扩容至原来的2倍
slice容量大于1024,扩容至原来的1.25倍
注意:slice的copy过程中不发生扩容。(长度为10的slice拷贝到长度为5的slice时,只会拷贝5个元素)。