Pointers 指向地图的指针

Pointers 指向地图的指针,pointers,dictionary,go,Pointers,Dictionary,Go,有一些地图定义为: var valueToSomeType = map[uint8]someType{...} var nameToSomeType = map[string]someType{...} 我想要一个指向映射地址的变量(不要复制所有变量)。我试过使用: valueTo := &valueToSomeType nameTo := &nameToSomeType 但在使用valueTo[number]时,会显示 内部编译器错误:var没有类型,init:new 如何

有一些地图定义为:

var valueToSomeType = map[uint8]someType{...}
var nameToSomeType = map[string]someType{...}
我想要一个指向映射地址的变量(不要复制所有变量)。我试过使用:

valueTo := &valueToSomeType
nameTo := &nameToSomeType
但在使用
valueTo[number]
时,会显示
内部编译器错误:var没有类型,init:new

如何得到它

编辑


错误由另一个问题显示。

映射是引用类型,因此它们总是通过引用传递。你不需要指针

更具体地说,来自:

切片、映射和通道是参考类型,不需要使用
new

内置函数make采用类型
T
,该类型必须是切片、映射或频道类型,后面可以是特定于类型的表达式列表。
它返回类型为
T
(不是
*T
)的值。
按照“初始值”一节中的说明初始化内存

但是,关于,参数是通过值传递的。(始终)。

除非map参数的值是指针。

@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()方法。

@JuliusF两者都传递,但我的回答更准确:指针是按值传递的。更多关于“传递值”的信息,请访问。@VonC非常感谢您的帮助。每天晚上睡觉前,我都会重复十次这是我的脑袋“指针是通过值传递的”。@XamEseerts太棒了!你的睡前习惯的下一步:看看这里:是的,戴夫描述得更好。读他的博客。有趣的是,一方面你可以说地图总是一个参考。表示映射值是指针。因此,当您使用映射的变量时,您正在使用该指针在映射中设置某些内容。另一方面,地图不是参考。因为映射值是一个指针,指针值被复制并自动取消引用。映射的指针是按值传递的。m[“tom”]知道如何去引用
m
实际上是什么指针。在围棋中,当你说“地图”时,实际上是指指向地图的指针。因为go语法抽象需要写
*m
离开。