0%

Golang: slice切片的坑

切片比数组的方便之处在于其长度可变,在append超出cap时可自动扩容,一次性扩充大小和具体情况有关,我测试的结果是每次扩容先×2,还不够则再线性增长

关于slice有两个注意点

slice的初始化问题
1
2
var arr = []int {0, 1, 2, 3, 4, 5, 6}
s1 := arr[0, 4]

注意这里s1初始化后为0, 1, 2, 3
slice这种方式初始化是左闭右开区间

slice的拷贝问题
1
2
3
var arr = []int {0, 1, 2, 3, 4, 5, 6}
s1 := arr[0, 4]
s2 := arr[1, 3]

如此初始化相当于一个引用,因此s1, s2存在内存重叠,改动s2会使s1发生改变

1
2
3
4
5
var arr = []int {0, 1, 2, 3, 4, 5, 6}
s1 := make([]int, 4)
copy(s1, arr[0:4])
s2 := make([]int, 2)
copy(s2, arr[1:3])

若如此,则为内容拷贝,不会发生改一变二的情况