企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
> go语言github项目:https://github.com/minibear2333/how_to_code 上一节说了切片与数组的区别,动态增加,len cap append copy 的知识,下面我补充一点。 [TOC] ### 切片的复制 切片的复制,回顾一下,我们原来是用`copy`函数 ```go slice2 := make([]int, len(slice1), cap(slice1)) /* 拷贝 slice1 的内容到 slice2 */ copy(slice2, slice1) // 注意是后面的拷贝给前面 ``` 切片还有一种方式复制方式,比较快速 ```go slice3 := slice2[:] ``` 但是有一种致命的缺点,这是浅拷贝,`slice3`和`slice2`是同一个切片,无论改动哪个,另一个都会产生变化。 ### 截取部分元素 切片之所以为切片,就是可以把部分元素截取出来 `slice2`的值是`[0 0 0 4 5 6]`,现在有一个需求,要截取第2个元素出来 ```go slice3 := slice2[0:1] ``` 输出 ``` len=1 cap=10 slice=[0] ``` 我们分别修改`slice3`和`slice2` ```go 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来复制一遍,如下。 ```go slice2 = []int{0, 0, 0, 1, 2, 3} slice3 = make([]int, 1, 1) copy(slice3, slice2[0:1]) ``` ### 工具函数补充 排序工具函数 ```go 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)