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}。看起来每次都返回元素的副本?
答案 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"