指向地图的指针

use*_*368 45 dictionary pointers go

将一些地图定义为:

var valueToSomeType = map[uint8]someType{...}
var nameToSomeType = map[string]someType{...}
Run Code Online (Sandbox Code Playgroud)

我想要一个指向地图地址的变量(不要复制所有变量).我尝试使用:

valueTo := &valueToSomeType
nameTo := &nameToSomeType
Run Code Online (Sandbox Code Playgroud)

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

怎么弄?

编辑

另一个问题显示错误.

the*_*mue 99

地图是参考类型,因此它们总是通过引用传递.你不需要指针.

  • 看看这里:https://dave.cheney.net/2017/04/29/there-is-no-pass-by-reference-in-go (3认同)

Von*_*onC 45

更具体地说,来自Golang规范:

切片,映射和通道是引用类型,不需要额外的分配间接new.
内置函数make采用一种类型T,它必须是切片,地图或通道类型,可选地后跟特定于类型的表达式列表.
它返回type T(not*T)的值.
内存初始化,如初始值一节中所述

但是,关于函数调用,参数按值(始终)传递.
除了map参数的值是一个指针.

  • @JuliusF两者,但我在答案中更精确:指针是按值传递的.有关"价值传递"的更多信息,请访问http://stackoverflow.com/a/23046811/6309. (3认同)

sab*_*bir 5

@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"
}
Run Code Online (Sandbox Code Playgroud)

这个程序的输出是

voldemort
Run Code Online (Sandbox Code Playgroud)

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

  • 地图的指针按值传递。m["tom"] 知道如何取消引用“m”实际上是什么指针。在 Go 中,当你说“地图”时,它实际上意味着指向地图的指针。因为 go 语法被抽象了,需要写掉`*m`。 (2认同)