【问题标题】:Pointer to a map指向地图的指针
【发布时间】:2011-02-18 01:37:57
【问题描述】:

将一些地图定义为:

var valueToSomeType = map[uint8]someType{...}
var nameToSomeType = map[string]someType{...}

我想要一个指向地图地址的变量(不要复制所有变量)。我试过了:

valueTo := &valueToSomeType
nameTo := &nameToSomeType

但在使用 valueTo[number] 时,它显示
内部编译器错误:var without type, init: new

如何获得?

编辑

错误是由另一个问题显示的。

【问题讨论】:

    标签: pointers dictionary go


    【解决方案1】:

    映射是引用类型,所以它们总是通过引用传递。你不需要指针。 Go Doc

    【讨论】:

    • 是的,戴夫描述得更好。阅读他的博客文章。
    • 有趣的是,一方面您可以说地图始终是参考。意味着映射值是一个指针。所以当你使用地图的变量时,你是在利用这个指针在地图中设置一些东西。另一方面,地图不是参考。因为映射值是一个指针,并且指针值被复制并自动取消引用。
    【解决方案2】:

    更具体地说,来自Golang Specs

    切片、映射和通道是引用类型,不需要额外间接分配new
    内置函数 make 采用类型 T,它必须是切片、映射或通道类型,可选地后跟特定类型的表达式列表。
    它返回一个T 类型的值(不是*T)。
    内存按照初始值一节中的描述进行初始化

    但是,对于function calls,参数是按值传递(始终)。
    除了 map 参数的值是一个指针。

    【讨论】:

    • @JuliusF 两者,但我的回答更准确:指针是按值传递的。在stackoverflow.com/a/23046811/6309了解更多关于“传递价值”的信息。
    • @VonC 非常感谢您。我会在每晚睡觉前重复这是我的头十次“指针按值传递”。
    • @XamEseerts 太好了!夜间前习惯的下一步:arpitbhayani.me/techie/…
    【解决方案3】:

    @Mue 的回答是正确的。

    以下简单程序足以验证:

    package main
    
    import "fmt"
    
    func main() {
        m := make(map[string]string, 10)
        add(m)
        fmt.Println(m["tom"]) // expect nil ???
    }
    
    func add(m map[string]string) {
        m["tom"] = "voldemort"
    }
    

    这个程序的输出是

    voldemort
    

    如果映射是按值传递的,那么在函数 add() 中添加映射不会在 main 方法中产生任何影响。但是我们看到了 add() 方法增加的价值。这将验证映射的指针是否已传递给 add() 方法。

    【讨论】:

    • 地图的指针是按值传递的。 m["tom"] 知道如何取消引用 m 实际上的指针。在 Go 中,当你说“地图”时,它实际上是指指向地图的指针。因为go语法抽象出来需要写*m
    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2019-04-03
    相关资源
    最近更新 更多