golang-切片
因为数组的长度在定义时就固定了,不能灵活调整,所以引入了切片。切片是一个拥有相同类型的长度可变的序列,可以看成是一类不定长的数组。
切片的定义格式
1 | var name []T |
从连续内存区域生成切片的格式
1 | slice [开始位置 : 结束位置) |
- slice:表示目标切片对象;
- 开始位置:对应目标切片对象的索引,闭区间;
- 结束位置:对应目标切片的结束索引,开区间,不包含结束位置元素,结束位置的取值上限是切片的容量而不是长度。
切片特性
- 取出的元素数量为:结束位置 - 开始位置;
- 取出元素不包含结束位置对应的索引,切片最后一个元素使用
slice[len(slice)]获取; - 当缺省开始位置时,表示从连续区域开头到结束位置;
- 当缺省结束位置时,表示从开始位置到整个连续区域末尾;
- 两者同时缺省时,与切片本身等效;
- 两者同时为 0 时,等效于空切片,一般用于切片复位。
- 切片之间不能直接进行比较,唯一合法的操作是与
nil进行比较,一个nil值的切片没有底层数组,其长度和容量都是0。
1 | package main |
完整切片表达式
对于数组,指向数组的指针或者切片(非字符串)支持完整切片表达式
1 | a[low : high : max] |
使用make()函数构造切片
make()函数格式:
1 | make( []Type, size, cap ) |
- Type 是指切片的元素类型
- size 指的是为这个类型分配多少个元素
- cap 为预分配的元素数量,这个值设定后不影响 size,只是能提前分配空间,降低多次分配空间造成的性能问题。如果省略,则其默认值为size的值
1 | slice3 := make([]int, 2) |
判断切片是否为空
判断切片是否为空是应该判断切片的长度而不是和nil比较
1 | //判断切片是否为空 |
使用make函数构造的切片实际上在定义size的时候就已经分配了内存而且元素的值被自动初始化为默认值,所以使用make函数构造的切片不为空。
向切片中添加元素
使用append()方法
1 | //使用append()方法向切片中添加元素 |
向切片追加元素时,切片会自动扩容,扩容策略是2*原切片容量或者2*追加元素个数,计算方法的第二个值以较大的为准。
切片的值引用
切片是引用类型,两个切片指向同一块内存地址时,修改一个切片会影响到另一个切片,使用copy()函数对切片进行值引用。它可以将原切片的数据完全复制给目标切片。格式:
1 | copy(destSlice, srcSlice []T) |
从切片中删除元素
利用切片的特性删除切片中的元素
1 | func main() { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 老屈子的折腾日记!