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

新手上路,请多包涵

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

你可以在 go playground 上查看。那么为什么我不能复制一个切片呢?

原文由 Salvador Dali 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 429
2 个回答

内置 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]

不幸的是,这没有记录在 builtin 包中,但它记录在 Go Language Specification: Appending to and copying slices 中

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

编辑:

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

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

原文由 icza 发布,翻译遵循 CC BY-SA 3.0 许可协议

另一种简单的方法是使用 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

原文由 Dave 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏