概述 #
copy
函数可以将一个切片里面的元素拷贝至另外一个切片,函数的原型如下:
func copy(dst []Type, src []Type) int
将切片 src
里面的元素拷贝至切片 dst
, 返回拷贝成功的元素数量。需要注意的一点是,copy
函数默认切片 dst
有足够的容量存放拷贝的元素,
如果容量不足的话,那么切片 src
中超过 dst
容量长度的元素将不再拷贝。
错误的做法 #
package main
import "fmt"
func main() {
var src, dst []int
src = []int{1, 2, 3}
n := copy(dst, src)
fmt.Printf("the number of copied elements is %d\n", n)
fmt.Printf("dst = %v\n", dst)
}
$ go run main.go
# 输出如下
the number of copied elements is 0
dst = []
从输出结果中看到,返回拷贝成功的元素数量为 0, 变量 dst
依然是一个空切片,错误的原因在于: 变量 dst
没有容量来存放变量 src
的元素。
接下来,我们修正这个错误。
正确的做法 #
package main
import "fmt"
func main() {
var src, dst []int
src = []int{1, 2, 3}
dst = make([]int, len(src)) // 提前初始化 dst 容量
n := copy(dst, src)
fmt.Printf("the number of copied elements is %d\n", n)
fmt.Printf("dst = %v\n", dst)
}
$ go run main.go
# 输出如下
the number of copied elements is 3
dst = [1 2 3]
从输出结果中看到,返回拷贝成功的元素数量为 3, 变量 src
的元素已经全部拷贝到 dst
里面。和刚才 错误的例子
不同,
我们在变量 dst
初始化完成后指定了容量为 3,这样正好可以存放变量 src
所有的元素。