概念
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函数需要传入三个参数:切片类型,长度,容量。当然,容量可以不传,默认和长度相等。
本文详细解析了Go语言中切片(slice)的概念、内部结构、创建方式及其与数组的区别。介绍了切片的三个核心属性:指针、长度和容量,并讨论了空切片与nil切片的区别。
1046

被折叠的 条评论
为什么被折叠?



