Golang 小技巧:使用 copy 复制 Slice,避免共享底层数组
【摘要】 在 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]
这是因为 a 和 b 仍然指向同一个底层数组。
如果希望得到一份独立的数据,可以使用 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)