go语言 切片知识补充

2020年5月6日22:51:35 发表评论 57 views

切片知识补充

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

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

weinxin
微信公众号
三分钟学习晦涩难懂的技术,分享开发、运维、云技术等方面知识,带您轻松打破技术壁垒,编程如鱼得水。欢迎您的关注~!
小熊

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: