go 切片知识补充

2020-05-12 10:53:33 浏览数 (1)

上一节说了切片与数组的区别,动态增加,len cap append copy 的知识,下面我补充一点。

切片的复制

切片的复制,回顾一下,我们原来是用copy函数

代码语言:javascript复制
 slice2 := make([]int, len(slice1), cap(slice1))
 /* 拷贝 slice1 的内容到 slice2 */
 copy(slice2, slice1) // 注意是后面的拷贝给前面

切片还有一种方式复制方式,比较快速

代码语言:javascript复制
 slice3 :=  slice2[:]

但是有一种致命的缺点,这是浅拷贝,slice3slice2是同一个切片,无论改动哪个,另一个都会产生变化。

截取部分元素

切片之所以为切片,就是可以把部分元素截取出来

slice2的值是[0 0 0 4 5 6],现在有一个需求,要截取第2个元素出来

代码语言:javascript复制
slice3 := slice2[0:1]

输出

代码语言:javascript复制
len=1 cap=10 slice=[0]

我们分别修改slice3slice2

代码语言:javascript复制
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]

0 人点赞