一尘不染

为什么我不能用`copy()`复制一个切片?

go

我需要在Go中制作切片的副本,并阅读文档,这里有一个复制功能供我使用。

内置复制功能将元素从源切片复制到目标切片。(在特殊情况下,它还会将字节从字符串复制到字节切片。)源和目标可能会重叠。复制返回复制的元素数量,该数量将是len(src)和len(dst)的最小值。

但是当我这样做时:

arr := []int{1, 2, 3}
tmp := []int{}
copy(tmp, arr)
fmt.Println(tmp)
fmt.Println(arr)

tmp与以前一样,我是空的(甚至尝试使用arr, tmp):

[]
[1 2 3]

您可以在运动场上查看。那为什么不能复制切片?


阅读 168

收藏
2020-07-02

共1个答案

一尘不染

内置copy(dst, src)副本min(len(dst), len(src))元素。

因此,如果您dst为空(len(dst) == 0),则不会复制任何内容。

尝试tmp := make([]int, len(arr))前往Playground):

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语言规范中:附加和复制切片

复制的元素的数目是最小len(src)len(dst)

编辑:

最后,的文档copy()已更新,现在包含以下事实:将复制源和目标的最小长度:

复制返回复制的元素数量,该数量将是len(src)和len(dst)的 最小值

2020-07-02