Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go map lookup返回元素的副本?_Go - Fatal编程技术网

Go map lookup返回元素的副本?

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都不会传递引用。它要么传递值,在赋值时复制,要么

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都不会传递引用。它要么传递值,在赋值时复制,要么这些值可以是指针,在这种情况下,副本是指针,实际上是一个引用

那么,让我们假设我们有

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永远不会传递引用”。