Go语言中map存储对象是按值还是指针?关于Conn类型的疑问
Go Map 存储 Conn 对象:是指针还是实际值?
嘿,这个问题问得很关键,不少刚接触Go的开发者都会在这儿打个问号。直接给你明确结论:你当前定义的map[string]Conn,存储的是Conn对象的实际值(也就是值的完整副本),并不是指针。
具体拆解一下:
- 当你执行
conns["127.0.0.1"] = Conn{}时,Go会把你创建的Conn{}实例完整拷贝一份,然后将这份副本存入map的底层bucket中。 - 举个例子:如果你先创建
c := Conn{},再执行conns["key"] = c,之后修改c的字段值,map里存储的那个副本不会跟着变化——因为它们是两个完全独立的实例。
要是想让map存指针怎么办?
如果你希望map里存储的是指向Conn对象的引用(也就是指针),只需要把map的类型改成map[string]*Conn,赋值时存入指针即可:
var conns map[string]*Conn conns["127.0.0.1"] = &Conn{}
这时候map里存储的就是指向实际Conn对象的指针,修改原对象的字段时,通过map里的指针访问到的内容也会同步变化。
补充个小细节
Go里的引用类型(比如slice、map、channel)本身在赋值时会传递指针,但你的Conn是自定义的值类型(比如结构体值类型),所以map存储它的时候就是存完整值。只有当你把Conn定义为指针类型,或者map的value类型设为指针时,才会存储指针。
内容的提问来源于stack exchange,提问作者Mostafa Talebi
相关产品推荐
相关产品推荐

