将一些地图定义为:
var valueToSomeType = map[uint8]someType{...}
var nameToSomeType = map[string]someType{...}
我想要一个指向地图地址的变量(不要复制所有变量)。我尝试使用:
valueTo := &valueToSomeType
nameTo := &nameToSomeType
但在使用valueTo[number]
时,它显示了
内部编译器错误:var没有类型,init:new
如何获得它?
修改
另一个问题显示错误。
答案 0 :(得分:90)
地图是引用类型,因此它们始终通过引用传递。你不需要指针。
答案 1 :(得分:44)
更具体地说,来自Golang Specs:
切片,地图和渠道为参考类型,不需要
部分所述进行初始化new
分配的额外间接。
内置函数make采用类型T
,它必须是切片,地图或通道类型,可选地后跟特定于类型的表达式列表。
它返回T
类型的值( not*T
) 内存按初始值
但是,关于function calls,参数会按值传递(始终)。
除了map参数的值是一个指针。
答案 2 :(得分:0)
@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()方法。