云原生科学-Go探索发现: 数组切片
数组
数组是值类型,初始化时固定了容量和类型。不支持append扩容。
切片
又称动态数组,依托数组实现,可以方面地进行扩容和函数传递,实际使用更加灵活。
初始化
声明和初始化有以下几种:
- 变量声明
- 字面量
- 使用内置make()函数
- 从切片和数组中切取
变量声明
var a []int
变量值为零值即nil
字面量
s1:=[]int{} //空切片
空切片是指长度为空,其值不是nil. 空切片分配了内存,而nil切片不需要分片内存。
make函数
s1:=make([]int,5,10) 指定长度和容量
预估容量可以有效地减少切片扩容时内存分配及拷贝次数。
切取
array:=[5]int{1,2,3,4,5}
s1:=array[0:2] //[low:high) 左开右闭原则
切片操作
append 声明的变量可以通过append自动初始化
扩容
- append追加元素时,容量够用,则将新元素追加进去,len++,返回slice
- 如果slice空间不足,超过容量后会重新开辟新内存空间,把原slice数据拷贝到新slice中,返回新slice,追加数据由扩容结束后完成。
slice拷贝
将源切片数据逐个拷贝到目的切片指向的数组,拷贝数量取决于两个切片长度最小值。
切片的结构体
type slice struct{
array unsafe.pointer 切片底层数组的起始位置
len int
cap int
}
array:=[10]int
slice:=array[5:7]
slice {&array[5],2,5}
切取string
a[low:high]
作用于数组,切片时产生新的切片,作用于字符串时会产生新的字符串,而不是切片
扩展表达式
简单表达式生成的新切片与原数组或切片共享底层数组避免了拷贝元素,节约内存,但带来了可能风险。append操作可能会覆盖已有的元素。
- 表达式
a[low:high:max]
- max用于限制新生切片的容量,新生切片容量为max-low,防止append函数修改底层数组
文档信息
- 本文作者:Beast
- 本文链接:https://beastpu.github.io/2021/07/20/go-02/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)