2015-06-18 17 views
-2

假设地图是Go中的引用类型,所以从函数返回它们时,不需要将其作为指向地图的指针传递,以便在函数体外部可以看到更改。但是如果所述映射从非指针结构的方法返回呢?虽然地图总是引用类型,但如果它们是从非指针接收器返回的呢?

例如:

type ExampleMapHolder struct { 
    theUnexportedMap map[string]int 
} 

func (emp ExampleMapHolder) TheMap() map[string]int { 
    return emp.theUnexportedMap 
} 

如果我做出TheMap()一个电话,然后修改它的数值,将这一变化可见的其他地方,即使接收者不是一个指针?我想它会返回一个对属于ExampleMapHolder副本的映射的引用,但一直未能在文档中找到明确的答案。

+0

提示:不要使用术语 “参考”。地图不是真正的参考类型。其实Go中没有任何内容是参考(不管是什么意思)。 – Volker

+0

根据Go博客,他们是:_“地图类型是引用类型,像指针和切片”_ - [在声明和初始化部分的一半](https://blog.golang.org/go-maps-in-行动) – leylandski

+2

术语“参考类型”从未被精确定义,许多人已经停止使用该术语来避免混淆。 “引用类型”的描述可以用来提示这些类型*在内部包含*指针,我想这可能意味着任何可以分配给nil的东西,但映射,片和指针仍然是值。 – JimB

回答

2

为什么你不检查它?

emp := ExampleMapHolder{make(map[string]int)} 
m := emp.TheMap() 
m["a"] = 1 
fmt.Println(emp) // Prints {map[a:1]} 

游乐场:http://play.golang.org/p/jGZqFr97_y

+0

我真的应该有。我太依赖于了。 – leylandski

相关问题