首页 >后端开发 >Golang >为什么在 Go 中对指针传递的映射进行索引会导致编译错误?

为什么在 Go 中对指针传递的映射进行索引会导致编译错误?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-13 00:36:02966浏览

Why Does Indexing a Map Passed by Pointer in Go Cause Compilation Errors?

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

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