Golang 小技巧:使用 copy 复制 Slice,避免共享底层数组

举报
Ray999 发表于 2026/08/31 11:53:03 2026/08/31
【摘要】 在 Go 中,直接给 Slice 赋值并不会真正复制数据。例如:a := []int{1, 2, 3}b := ab[0] = 100fmt.Println(a)输出:[100 2 3]这是因为 a 和 b 仍然指向同一个底层数组。如果希望得到一份独立的数据,可以使用 copy:a := []int{1, 2, 3}b := make([]int, len(a))copy(b, a)b[0]...

在 Go 中,直接给 Slice 赋值并不会真正复制数据。

例如:

a := []int{1, 2, 3}
b := a

b[0] = 100

fmt.Println(a)

输出:

[100 2 3]

这是因为 ab 仍然指向同一个底层数组。

如果希望得到一份独立的数据,可以使用 copy

a := []int{1, 2, 3}

b := make([]int, len(a))
copy(b, a)

b[0] = 100

fmt.Println(a)
fmt.Println(b)

输出:

[1 2 3]
[100 2 3]

这样修改 b 就不会影响 a

也可以使用这种写法:

b := append([]int(nil), a...)

同样可以创建一份新的 Slice 数据。

小结

当你需要真正复制一个 Slice,而不是共享底层数组时,可以使用:

dst := make([]T, len(src))
copy(dst, src)

这个小技巧在缓存数据、函数参数隔离、避免意外修改原始数据等场景中很实用。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。