Go:无效操作 - 类型 *map[key]value 不支持索引
背景:
Go 的指针机制可能会令人困惑,尤其是在使用映射时。在 Go 中,映射是一种引用类型,这意味着当您按值传递映射时,您传递的是引用的副本,而不是实际的映射本身。然而,有时我们可能需要修改作为参数传递给函数的原始映射。
问题:
当尝试通过指针传递映射到修改其内容,您可能会遇到以下错误:
prog.go:15: invalid operation: b[amount.Currency] (type *Balance does not support indexing)
此错误表明您正在尝试为指向地图的指针建立索引,该指针是Go 中不支持。
解决方案:
要解决此问题,您需要区分访问映射的值和指向它的指针。正确的方法如下:
func (b *Balance) Add(amount Amount) *Balance { // Index the *b (pointer to map) to get the map itself current, ok := (*b)[amount.Currency] // Continue modifying the indexed map // ... }
通过使用 *b 取消引用指针 b,您可以访问地图本身并可以对其执行必要的操作。
替代方法:
如果映射是结构中唯一的字段,就像本例中的情况一样例如,您可以避免通过指针传递它。相反,按值传递它,如以下代码所示:
func Add(b Balance, amount Amount) Balance { // ... do your operations on the passed map ... return b }
Go 默认情况下通过引用传递映射,因此即使您按值传递它,它仍然在内部被视为引用,并且任何更改函数内所做的操作反映在原始地图中。
请记住,在使用地图时,始终区分索引地图本身和指向它的指针。这将帮助您避免像本例中遇到的错误。
以上是为什么Go会抛出'无效操作:类型*map[key]value不支持索引”?的详细内容。更多信息请关注PHP中文网其他相关文章!