为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
qq_遁去的一_1 2021-10-04 17:18:41
我需要在 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上查看。那么为什么我不能复制切片呢?
查看完整描述

3 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

内置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) 中的最小值。


查看完整回答
反对 回复 2021-10-04
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

如果您的切片大小相同,它将起作用:


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


查看完整回答
反对 回复 2021-10-04
  • 3 回答
  • 0 关注
  • 259 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信