golang中slice越界问题

goslice由于其类似于一个长度可动态变化的数组而非常方便使用。
slice有两个基本属性:cap,len,分别代表容量和已有数据长度。
一般声明slice的两种方式如下:

1
2
3
4
//定义了一个初始长度为0,容量为2的int 类型的 `slice`
slice:=make([]int,0,2)

var slice=[]int{0,1}

slice中添加元素使用append方法:

1
slice=append(slice,1)

当然有时也可以使用索引值来直接赋值:

1
slice[0]=1

不过这种方式需要注意的是,索引的值不能大于slice的容量(cap),否则会报出panic: runtime error: index out of range错误。所以一般情况下应该优先使用append的方法给slice添加元素。

同样,对slice或者array进行切片(slice)操作的时候,索引也不能超过当前slice的容量或者array的长度

1
2
3
var slice = []int{0, 1, 2, 3, 4, 5, 6}
fmt.Println(slice[:5]) //[0,1,2,3,4]
fmt.Println(slice[1:10]) //slice bounds out of range

slice的容量扩容规则: 当容量不够时,容量扩充为之前容量的2倍

在调用append方法给slice添加元素的时候,可以一次添加多个或者全部:

1
2
3
4
5
6
var slice = []int{0,1}
var slice2 = []int{2,3}

fmt.Println(append(slice,slice2...)) //[0,1,2,3]

fmt.Println(append(slice,4,5)) //[0,1,4,5]

0%