上一节说了切片与数组的区别,动态增加,len cap append copy 的知识,下面我补充一点。
切片的复制
切片的复制,回顾一下,我们原来是用copy
函数
slice2 := make([]int, len(slice1), cap(slice1))
/* 拷贝 slice1 的内容到 slice2 */
copy(slice2, slice1) // 注意是后面的拷贝给前面
切片还有一种方式复制方式,比较快速
代码语言:javascript复制 slice3 := slice2[:]
但是有一种致命的缺点,这是浅拷贝,slice3
和slice2
是同一个切片,无论改动哪个,另一个都会产生变化。
截取部分元素
切片之所以为切片,就是可以把部分元素截取出来
slice2
的值是[0 0 0 4 5 6]
,现在有一个需求,要截取第2个元素出来
slice3 := slice2[0:1]
输出
代码语言:javascript复制len=1 cap=10 slice=[0]
我们分别修改slice3
和slice2
slice3[0] = 1
slice2[0] = 2
printSlice(slice2)
printSlice(slice3)
发现输出
代码语言:javascript复制len=6 cap=10 slice=[2 0 0 4 5 6]
len=1 cap=10 slice=[2]
说明,截取出现的元素依然是同一块内存(切片是引用类型的)。
所以截取部分元素之后,还是得用copy来复制一遍,如下。
代码语言:javascript复制slice2 = []int{0, 0, 0, 1, 2, 3}
slice3 = make([]int, 1, 1)
copy(slice3, slice2[0:1])
工具函数补充
排序工具函数
代码语言:javascript复制slice2 = []int{0, 3, 0, 1, 2, 0}
sort.Ints(slice2)
fmt.Println(slice2)
输出
代码语言:javascript复制[0 0 0 1 2 3]