Go map lookup返回元素的副本?
Go的map lookup似乎返回元素的副本。似乎找不到语言规范中描述的内容。我写了一篇如下: 类型T结构{n int}Go map lookup返回元素的副本?,go,Go,Go的map lookup似乎返回元素的副本。似乎找不到语言规范中描述的内容。我写了一篇如下: 类型T结构{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}。看起来每次返回元素的副本时?Go都不会传递引用。它要么传递值,在赋值时复制,要么
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}。看起来每次返回元素的副本时?Go都不会传递引用。它要么传递值,在赋值时复制,要么这些值可以是指针,在这种情况下,副本是指针,实际上是一个引用 那么,让我们假设我们有
type Foo struct {
Bar string
}
如果我们制作一张价值地图,即
m := map[string]Foo{}
然后映射访问返回一个Foo或零值Foo的副本:
m["x"] = Foo{"hello"}
y := m["x"]
y
现在与地图中的对象不同,因此更改其栏将不会影响地图中的对象
但是,如果我们让地图成为指针地图:
m := map[string]*Foo{}
然后访问它:
m["x"] = &Foo{"bar"}
y := m["x"]
y现在是指向地图中相同对象的指针。我们可以更改其栏
,它将影响地图:
y.Bar = "wat"
fmt.Println(m["x"].Bar)
// Will print "wat"
您是在问规范中哪里需要这种行为,还是您的问题是什么?我是在问规范中是否指定了这种行为。因为这对节目有影响。我知道,如果我频繁地对大值objectsOk进行映射查找,将完成大量内存分配/取消分配。我的问题由非高尔夫球手解释。“Go永远不会传递引用”。