Go 中按值传递与指针传递映射
在 Go 中,按值传递和按指针传递可能会令人困惑,尤其是在处理地图类型。本文解决了对通过指针传递的映射进行索引的问题,该问题会导致编译错误。
问题
当尝试通过指针传递映射并修改其时值,Go 会引发该类型不支持索引的错误。这是因为地图不支持在指针上建立索引。
解决方案
要避免此错误,请在对地图建立索引之前取消引用指针。使用 (*b)[amount.Currency] 代替 b[amount.Currency]。
进一步讨论
默认情况下,传递像整数这样的简单类型值,而结构和接口则通过引用传递。然而,地图的情况并非如此。默认情况下,映射通过引用传递,因此通过值或指针传递它们本质上是相同的。
在上面的示例中,没有必要为 Add 方法使用指针接收器,因为映射已经通过引用传递。该方法可以编写如下,而不会损失任何功能:
func (b Balance) Add(amount Amount) Balance { current, ok := b[amount.Currency] if ok { b[amount.Currency] = current + amount.Value } else { b[amount.Currency] = amount.Value } return b }
总之,在使用地图时,没有必要通过指针传递它们以避免复制。按值传递可以达到相同的结果,而不需要取消引用。
以上是为什么在 Go 中对指针传递的映射进行索引会导致编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!