一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情。
首先,我们先来了解下go的Slice,slice是由长度,容量和指向底层数组的指针组成可变长指向底层数组的数据类型。下面我们来了解一下slice的基本情况。
210定义:
s := make([]T,len,cap)
T:slice的具体类型
Len:slice的长度
Cap:slice的扩展,0<=len<=cap
声明(示例为其中一种):
a := []int{1,2,3}//声明和定义,此处也可看作同时定义了一个匿名的数组,变量a指向了这个数组的地址
slice有一个特性,多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠,通常可用slice的切片操作生成指向原slice的指针地址,长度(0<=len<=cap)可灵活调整的新切片,当然另一个方法是赋值(指针地址,长度容量和原slice一致),暂且不展开细说。今天着重说一下slice的切片操作。
切片操作定义:
slice [开始位置i : 结束位置j]
Slice:表示目标的切片对象
开始位置i:对目标切片开始索引(下标),0<=i<=cap,可省略,默认0
结束位置j:对目标切片结束索引(下标),i<=j<=cap,可省略,默认len
slice的切片操作遵循左闭右开原则,取出元素的数量j-i
切片操作的边界问题
先说一下切片操作容易混淆和忽略的边界问题,简单来说就是两可两不可。
一不可:获取len下标的值不可以
一 可:获取len开始的切片可以,将会得到新切片
二不可:获取超过==len<=cap下标的值不可以
二 可:获取==len<=cap的切片可以
下面我分别用代码实验证明上面的结论:
1.获取len下标的值
代码示例:
func main(){
a := []int{1, 2, 3}
fmt.Println(a, len(a), cap(a)) //[1 2 3] 3 3
//获取len下标的值
b := a[3]
fmt.Println(b)
}
运行结果:
[1 2 3] 3 3
panic: runtime error: index out of range
2.获取len长度的切片
代码示例:
func main(){
a := []int{1, 2, 3}
fmt.Println(a, len(a), cap(a))
//获取len长度的切片
b := a[len(a):]
fmt.Println(b, len(b), cap(b))
}
运行结果:
[1 2 3] 3 3
[] 0 0