首页 > 后端开发 > Golang > Go 切片与映射:为什么追加行为不同?

Go 切片与映射:为什么追加行为不同?

Patricia Arquette
发布: 2024-12-19 17:13:10
原创
315 人浏览过

Go Slices vs. Maps: Why Do Appends Behave Differently?

切片与映射:了解参数引用行为

在 Go 中,切片和映射都表示引用类型。当修改任一类型的元素时,更改会反映在从它们派生的所有切片/映射中。这种共享修改行为是由基于指针的映射实现产生的,其中通过指针进行的修改适用于原始映射。

但是,当添加新元素时,切片和映射的行为不同。在提供的代码示例中,将新元素附加到地图 (editMap) 会导致可以通过原始地图访问这些元素。但是,追加到切片 (editSlice) 对原始切片没有影响。

这种差异源于切片和映射之间的底层实现差异。映射被实现为指向哈希映射结构的指针,而切片是引用数组的轻量级结构。当向映射添加新元素时,指针保持不变,从而导致新元素在所有派生映射中可见。

相反,当附加到切片时,切片头(描述切片的长度,容量和数组指针)必须修改。但是,由于 Go 按值传递变量,因此对切片头副本(在传入参数中)所做的任何更改都不会反映在原始切片中。

为了在切片和映射之间实现一致的行为,可以将切片实现为指针,类似于映射。这将确保通过切片指针进行的修改也会修改原始切片。然而,由于缺乏对传递和使用切片指针的语言支持,这种方法在 Go 中并不常见。相反,修改后返回新切片的约定被广泛采用。

以上是Go 切片与映射:为什么追加行为不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板