Go是否按值或作为指针将对象存储在map中?

时间:2019-07-09 12:23:46

标签: go

我有以下地图:

var conns map[string]Conn

如您所知,Conn是自定义类型。正如声明所示,我的地图存储Conn类型的值。 为了将它们存储在地图中,我这样做:

conns["127.0.0.1"] = Conn{}

但是我的问题是Go是在底层存储了指向Conn对象的指针还是实际上存储了值?

1 个答案:

答案 0 :(得分:4)

struct是按值存储的。对conns["127.0.0.1"]的访问将为您提供Conn结构的副本

如果您尝试以这种方式修改结构,则conns["127.0.0.1"]处的结构将保持不变,直到您用新修改的结构覆盖映射条目为止。

c := conns["127.0.0.1"]
c.x = y

// `c` now contains different content to `conns["127.0.0.1"]`!

// To ensure conns["127.0.0.1"] is updated, either overwrite or use a point.
conns["127.0.0.1"] = c // overwrite

这就是为什么在修改结构时,映射中的结构将保持不变,直到用新的结构覆盖映射条目为止。

相反,您可以存储指向该结构的指针。这样可以直接修改结构。

因此,如果您将conns的类型从map[string]Conn更改为map[string]*Conn,则上述代码的前两行将更新地图中的结构。

更多信息可以在这里找到:https://www.ardanlabs.com/blog/2017/07/interface-semantics.html