当前位置: 首页 > 知识库问答 >
问题:

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

缑永年
2023-03-14

我需要在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):

[]
[1 2 3]

你可以去游乐场看看。那么为什么我不能复制一个切片呢?

共有3个答案

沈乐邦
2023-03-14

如果你的切片大小相同,它会工作:

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

将提供:

3
[1 2 3]
[1 2 3]

从"Go Slices:用法和内部":

复制函数支持在不同长度的切片之间复制(它将只复制较少数量的元素)

通常的例子是:

t := make([]byte, len(s), (cap(s)+1)*2)
copy(t, s)
s = t
范麒
2023-03-14

另一种简单的方法是使用append来分配进程中的切片。

arr := []int{1, 2, 3}
tmp := append([]int(nil), arr...)  // Notice the ... splat
fmt.Println(tmp)
fmt.Println(arr)

产出(如预期):

[1 2 3]
[1 2 3]

正如下面的注释所指出的,append可能会分配多余的内存,如果片的大小一开始就不正确。一个很好的解决方案是预先分配一部分合适的容量,如下所示:

tmp := append(make([]int, 0, len(arr)), arr...)

因此,复制数组arr的缩写是append(make([]int,0,len(arr)),arr…)

https://play.golang.org/p/xwevI1chGrd

杜俭
2023-03-14

内置的copy(dst,src)复制min(len(dst),len(src))元素。

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

尝试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]

不幸的是,这并没有记录在内建包中,但它记录在Go语言规范:附加到和复制切片中:

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

编辑:

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

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

 类似资料:
  • 问题内容: 我需要在Go中制作切片的副本,并阅读文档,这里有一个复制功能供我使用。 内置复制功能将元素从源切片复制到目标切片。(在特殊情况下,它还会将字节从字符串复制到字节切片。)源和目标可能会重叠。复制返回复制的元素数量,该数量将是len(src)和len(dst)的最小值。 但是当我这样做时: 与以前一样,我是空的(甚至尝试使用): 您可以在运动场上查看。那为什么不能复制切片? 问题答案: 内

  • 我有自己的目录结构: 在我的Dockerfile中,我将复制到目录,但不幸的是,它没有被复制: 错误:

  • 我今天想使用,但出现了如下错误: 所以我想我应该清除并重新安装(如下所示)https://www.rosehosting.com/blog/how-to-install-pip-on-ubuntu-16-04/)但仍然得到: 我怎样才能提高我的水平

  • 我创建了一个复制类,它接受源文件夹和目标文件夹以及一个文件名数组。因此,该类搜索源文件夹,如果遇到与数组元素同名的文件,则将该文件复制到与源文件夹结构相同的文件夹结构中。下面是课程: 指向这一行:`新的复制文件(src、dest、array); 有什么解决的办法吗?

  • 可能重复:< br >什么是复制省略和返回值优化? 我有以下程序: 我期望的输出如下: 但我得到以下信息: 问题是:为什么不将对象从func返回到main调用我的复制构造函数?

  • 所以我在JavaScript中使用了