Go语言中常见100问题-#24 Not making slice copies correctly
2023-02-25 18:22:08 时间
如何正确的对切片进行拷贝
内置的 copy 函数实现了将源切片中的数据拷贝到目标切片中的功能,尽管这是一个常用的内置函数,但是还是有不少开发者使用有误。下面会通过具体的例子说明 copy 的错误使用。如下代码中期望通过 copy 函数将源切片 src 中的数据拷贝到目标切片 dst中,猜猜程序打印的内容是什么?
src := []int{0, 1, 2}
var dst []int
copy(dst, src)
fmt.Println(dst)
执行上述程序,输出内容是[], 并不是我们预期的0 1 2, 为啥呢?这需要对copy有深入的理解。copy函数将源切片中的数据拷贝到目标切片时,拷贝的元素个数为下面两个长度中较小的一个。
- 源切片的长度
- 目标切片的长度
在前面的代码中,源切片src的长度为3,但是目标切片dst的长度为0,因此,调用copy函数拷贝的元素个数为0,所以打印输出为空切片。
如果我们想进行完整的拷贝,目标切片的长度必须不小于源切片的长度。像下面这样,将目标切片的长度设置为与源切片一样长,这时打印输出内容为0 1 2.
src := []int{0, 1, 2}
dst := make([]int, len(src))
copy(dst, src)
fmt.Println(dst)
***NOTE:另一个常犯的错误是颠倒了调用copy函数参数顺序。记住第一个参数表示将元素拷贝到的目标位置,第二参数是源数据的位置。***
此外,需要了解拷贝元素并不是只有调用copy函数一种方式,在其他实现方法中最广泛熟知的是下面这种通过append函数的方法。将源切片append到一个nil切片中,这时将创建一个长度为3,容量为3的目标切片。相比前一种方法,这种方法优势是代码简短,只需要一行代码。但是使用copy更地道,更容易理解。
src := []int{0, 1, 2}
dst := append([]int(nil), src...)
总结,将一个切片中的元素拷贝到另一个切片是一种非常频繁的操作,当我们使用copy函数时,需要记得拷贝的元素个数是源切片和目标切片中长度较短的。此外,需要知道拷贝元素并不是只有copy一种方法,在代码库中看到其它拷贝元素方法时不要惊讶。
相关文章
- 从零开始配置vim(30)——DAP的其他配置
- 保险第一课 - 个人理财课程
- 开篇 - 个人理财课程
- 做人与做事 - 我的闪存
- 我写的诗 - 雪凝
- 想开了 - 我的闪存
- 天赋 - 我的闪存
- 江西省民用航空产业服务平台正式上线运行
- Linux 资料大全
- tep1.0.0正式版发布且将不再维护
- 我写的诗 - 忆涵
- 国内十大跨境电商平台排行榜,我国跨境电商平台有哪些?
- Flow简介
- 微软 Outlook 如何修改邮件列表中的字体或字号
- 还在用 XShell - 试试 IntelliJ IDEA 的 SSH
- 区块链交易所开发功能
- 跨境电商平台还有哪些?跨境电商出口平台排名
- 主流的跨境电商平台有哪些
- 跨境电商平台有哪些
- 机械键盘的 黑轴/茶轴/青轴/红轴 有什么区别