在 Go 中使用切片时,您可能会遇到需要深度复制切片的需求,以确保对副本的更改不会发生不影响原来的切片。本文探讨了两种简洁且性能良好的方法来实现此目的。
一种成熟的技术是使用追加函数:
copy := append([]T{}, orig...)
但是,还有一种使用内置副本的替代方法函数已经出现:
cpy := make([]T, len(orig)) copy(cpy, orig)
复制函数的文档指出,它将元素从源切片复制到目标切片,必要时重叠。它返回复制的元素数量,该数量受到两个切片长度的限制。
注意: 两种方法仅复制切片中的值。如果切片包含指针或具有指针字段的结构,这些指针将继续指向与原始切片中相同的值。
基准结果:
评估为了检查这些方法的性能,进行了基准测试:
BenchmarkCopy 100000 24724 ns/op BenchmarkAppend 100000 24967 ns/op
如您所见,两种方法非常相似
程序集分析:
检查为每个方法生成的程序集发现,两者都调用runtime.growslice或runtime.makeslice,它们可能负责执行任何新切片需要零填充。
以上是在 Go 中深度复制切片的最简洁、最高效的方法是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!