我有以下地图:
var conns map[string]Conn
如您所知,Conn
是自定义类型。正如声明所示,我的地图存储Conn类型的值。
为了将它们存储在地图中,我这样做:
conns["127.0.0.1"] = Conn{}
但是我的问题是Go是在底层存储了指向Conn
对象的指针还是实际上存储了值?
答案 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