go语言 切片知识补充 复制、截取、排序

2,209 阅读1分钟


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

切片的复制

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

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

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

 slice3 :=  slice2[:]

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

截取部分元素

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

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

slice3 := slice2[0:1]

输出

len=1 cap=10 slice=[0]

我们分别修改slice3slice2

slice3[0] = 1
slice2[0] = 2
printSlice(slice2)
printSlice(slice3)

发现输出

len=6 cap=10 slice=[2 0 0 4 5 6]
len=1 cap=10 slice=[2]

说明,截取出现的元素依然是同一块内存(切片是引用类型的)。

所以截取部分元素之后,还是得用copy来复制一遍,如下。

slice2 = []int{0, 0, 0, 1, 2, 3}
 slice3 = make([]int, 1, 1)
 copy(slice3, slice2[0:1])

工具函数补充

排序工具函数

slice2 = []int{0, 3, 0, 1, 2, 0}
 sort.Ints(slice2)
 fmt.Println(slice2)

输出

[0 0 0 1 2 3]

排序用户自定义数据集参考 https://coding3min.com/785.html

本文使用 mdnice 排版