Go语言函数参数采用值传递,但修改函数内切片元素却能影响外部切片,这并非与值传递矛盾。 理解Go切片的工作原理是关键。
Go切片并非直接存储数据,而是由指针、长度和容量三部分组成。指针指向底层数组的起始位置,长度表示切片当前元素个数,容量则表示底层数组大小。
当切片作为函数参数传递时,传递的是切片副本,包含指针、长度和容量。 修改切片元素时,实际上是通过指针修改底层数组元素,而这个底层数组可能被多个切片共享。因此,函数内修改会反映到所有指向该数组的切片上。
例如,函数内直接修改切片元素(例如 arr[0] = 100),会改变底层数组,从而影响外部切片。
立即学习“go语言免费学习笔记(深入)”;
然而,append 函数的行为不同。 append 会尝试在原切片底层数组添加元素。若空间不足,它会分配新的更大数组,复制原元素,再添加新元素,并返回指向新数组的新切片。 原切片仍指向旧数组,因此外部切片不受影响。
append 函数潜在的创建新底层数组是关键区别。直接索引修改操作共享的底层数组,而 append 可能创建新的数组。 这就是Go语言切片值传递特性和底层数组共享机制的体现。
以上就是Go语言中切片参数传递:值传递为何能修改外部切片元素?的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2538118.html