概念
Slice即切片,它和数组(array)
很类似,可以用下标的方式进行访问。如果越界,就会产生 panic。但是它比数组更灵活,可以自动地进行扩容。
1,slice源码
// runtime/slice.go
type slice struct {
array unsafe.Pointer // 元素指针
len int // 长度
cap int // 容量
}
可以看出,slice
共有三个属性
1) 指针
,指向底层数组;
2)长度
,表示切片可用元素的个数,也就是说使用下标对 slice 的元素进行访问时,下标不能超过 slice 的长度;
3)容量
,底层数组的元素个数,容量 >= 长度。在底层数组不进行扩容的情况下,容量也是 slice 可以扩张的最大限度。
注意:底层数组是可以被多个 slice 同时指向的,因此对一个 slice 的元素进行操作是有可能影响到其他 slice 的。
2,slice的创建
// 1)直接声明
var slice []int
// 2) new关键字
slice := *new([]int)
// 3)字面量
slice := []int{1,2,3,4,5}
// 4)make
slice := make([]int, 5, 10)
// 5) 从数组/切片中截取
slice := array[1:5] 或 slice := sourceSlice[1:5]
注意
第一种创建出来的 slice 其实是一个 nil slice
。它的长度和容量都为0。和nil
比较的结果为true。
这里比较混淆的是empty slice
,它的长度和容量也都为0,但是所有的空切片的数据指针都指向同一个地址 0xc42003bda0
。空切片和 nil
比较的结果为false
。
空切片的定义:
var slice = []int{}
var slice = make([]int,0)
make
函数需要传入三个参数:切片类型,长度,容量。当然,容量可以不传,默认和长度相等。