切片与映射:了解参数引用行为
在 Go 中,切片和映射都表示引用类型。当修改任一类型的元素时,更改会反映在从它们派生的所有切片/映射中。这种共享修改行为是由基于指针的映射实现产生的,其中通过指针进行的修改适用于原始映射。
但是,当添加新元素时,切片和映射的行为不同。在提供的代码示例中,将新元素附加到地图 (editMap) 会导致可以通过原始地图访问这些元素。但是,追加到切片 (editSlice) 对原始切片没有影响。
这种差异源于切片和映射之间的底层实现差异。映射被实现为指向哈希映射结构的指针,而切片是引用数组的轻量级结构。当向映射添加新元素时,指针保持不变,从而导致新元素在所有派生映射中可见。
相反,当附加到切片时,切片头(描述切片的长度,容量和数组指针)必须修改。但是,由于 Go 按值传递变量,因此对切片头副本(在传入参数中)所做的任何更改都不会反映在原始切片中。
为了在切片和映射之间实现一致的行为,可以将切片实现为指针,类似于映射。这将确保通过切片指针进行的修改也会修改原始切片。然而,由于缺乏对传递和使用切片指针的语言支持,这种方法在 Go 中并不常见。相反,修改后返回新切片的约定被广泛采用。
以上是Go 切片与映射:为什么追加行为不同?的详细内容。更多信息请关注PHP中文网其他相关文章!