我需要在 Go 中制作一个切片的副本并阅读文档,我可以使用复制功能。
copy 内置函数将元素从源切片复制到目标切片。(作为一种特殊情况,它还会将字节从字符串复制到字节切片。)源和目标可能重叠。Copy 返回复制的元素数,这将是 len(src) 和 len(dst) 中的最小值。
但是当我这样做时:
arr := []int{1, 2, 3} tmp := []int{} copy(tmp, arr) fmt.Println(tmp) fmt.Println(arr)
我tmp的和以前一样是空的(我什至尝试使用arr, tmp):
tmp
arr, tmp
[] [1 2 3]
你可以在 go playground上查看。那么为什么我不能复制切片呢?
内置copy(dst, src)复制min(len(dst), len(src))元素。
copy(dst, src)
min(len(dst), len(src))
因此,如果您的dst值为空 ( len(dst) == 0),则不会复制任何内容。
dst
len(dst) == 0
尝试tmp := make([]int, len(arr))(go):
tmp := make([]int, len(arr))
arr := []int{1, 2, 3} tmp := make([]int, len(arr)) copy(tmp, arr) fmt.Println(tmp) fmt.Println(arr)
输出(如预期):
[1 2 3] [1 2 3]
不幸的是,这在builtin包中没有记录,但在Go Language Specification: Appending to and copying slices 中有记录:
builtin
复制的元素的数目是最小len(src)和len(dst)。
len(src)
len(dst)
编辑:
最后,文档copy()已更新,现在包含将复制源和目标的最小长度的事实:
copy()
Copy 返回复制的元素数,这将是len(src) 和 len(dst) 中的最小值。