go语言 切片知识补充

2020年5月6日 评论 216 views 724字阅读2分24秒

切片知识补充

上一节说了切片与数组的区别,动态增加,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]

其他知识参考 排序用户自定义数据集

Golang最后更新:2020-8-31
小熊