Go语言切片:修改子切片为什么有时不会影响原切片?

go语言切片:修改子切片为什么有时不会影响原切片?

深入Go语言切片:子切片修改与原始切片的关系

本文分析Go语言切片(slice)的特性,重点关注子切片操作对原始切片的影响。我们将通过示例代码解释为何修改子切片有时不会改变原始切片。

示例代码展示了两个切片 s1s2,其中 s2s1 的子切片:s2 := s1[2:]。 程序首先打印 s1s2 的长度、容量和内存地址。 这表明 s2 的底层数组与 s1 共享同一内存空间,只是 s2 指向 s1 的第三个元素。

修改 s2 中的元素(例如 s2[0] = 99)会同时改变 s1 中对应的元素,这体现了切片共享底层数组的特性。然而,当对 s2 执行 append 操作后,情况有所不同。append 操作可能导致底层数组重新分配,使 s2s1 不再共享内存。 因此,append(s2, 199) 后,修改 s2[1] 不会影响 s1

立即学习“go语言免费学习笔记(深入)”;

append 函数的底层实现会根据需要动态扩容切片的底层数组。如果容量不足,append 会分配一个更大的新数组,复制原数组元素到新数组,再添加新元素。 这使得 s2 指向新的底层数组,而 s1 仍然指向原数组,两者不再共享内存。

结论:append 等改变切片容量的操作可能导致底层数组重新分配,从而破坏子切片与原始切片的共享关系。只有在不改变容量的情况下修改子切片,才会影响原始切片。

以上就是Go语言切片:修改子切片为什么有时不会影响原切片?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1385548.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月15日 05:29:58
下一篇 2025年12月15日 05:30:26

相关推荐

发表回复

登录后才能评论
关注微信