You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:42:04