如何正确的对切片进行拷贝
内置的 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函数参数顺序。记住第一个参数表示将元素拷贝到的目标位置,第二参数是源数据的位置。
此外,需要了解拷贝