首页 >后端开发 >Golang >为什么Go会抛出'无效操作:类型*map[key]value不支持索引”?

为什么Go会抛出'无效操作:类型*map[key]value不支持索引”?

DDD
DDD原创
2024-11-25 08:07:40879浏览

Why Does Go Throw

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn