- 实现原理数据结构
type slice struct{
array unsafe.Pointer //指向底层数组
len int //切片长度
cap int //底层数组的容量
}
-
切片操作
-
使用make()创建slice,可以同时指定长度和容量,创建时底层会分配一个数组,数组的长度即为容量。
-
使用数组创建切片,使用数组创建slice时,slice将与原数组共用部分内存
array := [10]int slice := array[5:7] len(slice) = 2 cap(slice) = 5
数组和数组的切片共享底层存储空间这是使用过程中需要额外注意的地方
-
-
slice扩容
扩容实际上时重新分配一块更大的内存,将原slice的数据拷贝进新slice,然后返回新slice,扩容后在将数据追加进去;
扩容只关心容量,追加数据由append在扩容结束后完成。
- 扩容规则:
- 如果原slice的容量小于1024,则新的slice的容量扩大为原来的2倍
- 如果原slice的容量大于或等于1024,则新slice的容量将扩大为原来的1.25倍
- 扩容规则:
-
slice拷贝
使用copy()内置函数拷贝两个切片时,会将源切片的数据逐个拷贝到目的切片指向的数组中,拷贝数量取两个切片长度的最小值。
也就是说拷贝过程不发生扩容
-
小结
- 每个切片指向一个底层数组
- 每个切片都保存了当前切片的长度,底层数组的可用容量
- 使用len()和cap()时间复杂度都为O(1)
- 通过函数传递切片时,不会拷贝整个切片,因为切片本身只是一个结构体



