Go map lookup返回元素的副本?

时间:2017-02-08 07:51:28

标签: go

Go的地图查找似乎返回了元素的副本。似乎无法在语言规范中找到这种描述。我写了一个program如下:

输入T struct {n int}

m := make(map[string]T)
t := T{123}
m["123"] = t
t0 := m["123"]
t1 := m["123"]
t0.n = 456
t1.n = 789
fmt.Println(t, t0, t1)

我的输出为:{123} {456} {789}。看起来每次都返回元素的副本?

1 个答案:

答案 0 :(得分:8)

Go不会传递引用。它要么传递值,要么在赋值时制作副本,要么这些值可以是指针,在这种情况下,副本是指针,实际上它是一个引用。

所以我们说我们有

type Foo struct {
   Bar string
}

如果我们制作一个价值图,即

m := map[string]Foo{}

然后map访问返回Foo的副本,或者返回零值的Foo:

m["x"] = Foo{"hello"}

y := m["x"]

y现在与地图中的对象不同,因此更改其Bar不会影响地图中的对象。

但是,如果我们使地图成为指针图:

m := map[string]*Foo{}

然后访问它:

m["x"] = &Foo{"bar"}
y := m["x"]

y现在是指向与地图中相同对象的指针。我们可以更改其Bar,它会影响地图:

y.Bar = "wat"
fmt.Println(m["x"].Bar)

// Will print "wat"

Playground example.