Go语言中常见100问题-#24 切片拷贝最佳实践

切片拷贝

内置的 copy 函数实现了将源切片中的数据拷贝到目标切片中的功能,尽管这是一个常用的内置函数,但是还是有不少开发者使用有误。下面会通过具体的例子说明 copy 的错误使用。

案例引入

如下代码中期望通过 copy 函数将源切片 src 中的数据拷贝到目标切片 dst中,猜猜程序打印的内容是什么?

golang 复制代码
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.

golang 复制代码
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更地道,更容易理解。

golang 复制代码
src := []int{0, 1, 2}
dst := append([]int(nil), src...)

总结

将一个切片中的元素拷贝到另一个切片是一种非常频繁的操作,当我们使用copy函数时,需要记得拷贝的元素个数是源切片和目标切片中长度较短的。此外,需要知道拷贝元素并不是只有copy一种方法,在代码库中看到其它拷贝元素方法时不要惊讶。

相关推荐
kyriewen4 分钟前
我扒了最近的前端面经——2026年面试不背八股文了,考这5样
前端·面试·ai编程
码事漫谈14 分钟前
告别数据孤岛与AI“水土不服”:金仓多模融合时序库如何让数据真正服务于业务
后端
IT_陈寒23 分钟前
Redis的持久化配置把我坑惨了:你以为数据安全了?
前端·人工智能·后端
小徐_233331 分钟前
uni-app 项目别再从零搭了!3 个 Wot UI 起手模板怎么选?
前端·uni-app
星栈32 分钟前
Node 接口该写同步还是异步?
后端·node.js
红烧大青虫1 小时前
HarmonyOS应用开发实战:小事记 - UIAbility 的冷启动/热启动/后台启动三种场景与 launchParam 解析
后端·华为·harmonyos·鸿蒙系统
码事漫谈1 小时前
AI Token 缓存:命中省 10 倍,不命中白扔钱
后端
65岁退休Coder1 小时前
LangChain v1.3.4 笔记 - 04 Agent 中间件
后端
赵庆明老师1 小时前
Vben精讲:16-熟悉Vite前端工具链
前端
神奇小汤圆2 小时前
一个接口多个实现,Spring 怎么"适配多场景"?
后端