Go语言map是值传递还是引用传递_Golang map传参特性说明
技术百科
P粉602998670
发布时间:2026-01-26
浏览: 次 Go中map传参是值传递含指针的结构体,故修改影响原map;不可比较、不能作key;清空用clear或遍历delete;并发读写不安全需同步。
Go语言中map是引用传递,但底层实现不是指针,而是包含指针的结构体值传递。 这个说法看似矛盾,却是理解map传参行为的关键——它既不会像slice那样因底层数组扩容而“断开连接”,也不会像普通struct那样完全隔离修改。实际表现接近引用传递,但机制更微妙。
为什么map赋值和传参后修改会影响原变量
因为map类型在Go运行时是一个头结构(hmap),其中包含指向底层哈希桶数组的指针、长度、哈希种子等字段。当你把一个map赋值给另一个变量,或作为参数传入函数时,复制的是这个头结构的值,而该结构里存着的指针仍指向同一块内存。
所以以下操作都会影响原始map:
- 在函数内调用
delete(m, key) - 执行
m[key] = value - 遍历中修改元素值(如
m[k]++)
但注意:make(map[int]int)返回的是新分配的hmap结构,不是指针;只是这个结构里自带指针,导致“看起来像引用”。
map不能直接比较,也不能作为map的key
因为map是不可比较类型,编译器会报错:invalid operation: m1 == m2 (map can only be compared to nil)。这是由其内部指针和动态结构决定的——两个map即使内容相同,底层桶地址也不同,无法安全定义“相等”。
同样,map不能做其他map的key,或放入struct后参与比较,原因一致:不可比较。
如果需要判断两个map是否逻辑相等,必须手动遍历比对键值,或用reflect.DeepEqual(仅限开发/测试,性能差且不处理循环引用)。
常见误判场景:重置map变量不等于清空内容
很多人以为m = make(map[string]int)能“清空”原map,其实只是

m指向一个全新结构,原map若还有其他变量引用,内容依然存在(比如被闭包捕获、或作为切片元素存储)。
真正清空应使用:
-
for k := range m { delete(m, k) }(推荐,明确、安全) -
clear(m)(Go 1.21+,语义清晰,底层复用原有底层数组)
避免写m = nil后又直接m["x"] = 1,这会panic:assignment to entry in nil map。
最易忽略的一点:map的并发读写不安全,哪怕只是“读+读+写”混合,也必须加锁或用sync.Map。这不是传参问题,但常和传参后的多goroutine共享行为一起踩坑。
# go语言
# go
# golang
# 循环
# String
# int
# 指针
# 为什么
# red
# 结构体
# Struct
# for
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Mac的访达(Finder)怎么用_Mac文件管理
- 如何使用Golang处理静态文件缓存_提高页面加载
- 如何在Golang中使用log包输出不同级别日志_
- Python解释执行模型_字节码流程说明【指导】
- Python项目维护经验_长期演进说明【指导】
- Windows音频驱动无声音原因解析_声卡驱动错误
- Win10如何备份驱动程序_Win10驱动备份步骤
- Windows蓝屏错误0x00000023怎么修复
- Dapper的Execute方法的返回值是什么意思
- PHP主流架构如何做单元测试_工具与流程【详解】
- 如何优化Golang程序CPU性能_Golang
- Win11怎么查看wifi信号强度_检测Windo
- Win11怎么修复系统文件_使用sfc命令修复Wi
- Win11怎么关闭触摸屏_禁用Win11笔记本触摸
- Win11如何更改用户账户文件夹名称 Win11修
- Win11怎么设置环境变量_Win11配置Path
- 如何使用Golang管理跨项目依赖_Golang多
- Win11怎么更改鼠标指针_Windows 11自
- Windows10电脑怎么设置电源按钮_Win10
- Windows10系统怎么查看系统版本_Win10
- c++的STL算法库find怎么用 在容器中查找指
- Win11怎么关闭自动维护 Win11禁用系统自动
- 如何在Golang中处理JSON字段缺失_Gola
- mac怎么安装adb_MAC配置Android A
- Win11任务栏怎么调到左边_Win11开始菜单居
- 如何解决同一段404代码在不同主机上表现不一致的问
- Win11怎么开启游戏模式_Windows11优化
- Windows 10自带杀毒软件在哪_Window
- Win11怎么关闭粘滞键_彻底禁用Windows
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- 如何在 Go 应用中实现自动错误恢复与进程重启机制
- Win11怎么设置任务栏透明_Windows11使
- PHP 中如何在函数内持久化修改引用变量的指向
- Golang如何避免指针逃逸_Golang逃逸分析
- Win11怎么更改默认打开方式_Win11关联文件
- Windows电脑如何进入安全模式?(多种按键方法
- php条件判断怎么写_ifelse和switchc
- 如何用正则与预处理结合精准拦截拼接式垃圾域名
- Win10电脑怎么设置休眠快捷键_Windows1
- Windows系统时间服务错误_W32Time服务
- Windows10怎样连接蓝牙设备_Windows
- Win10电脑怎么设置网络名称_Windows10
- 当网站SEO排名下降时,如何应对?
- Win11怎么连接投影仪_Win11多显示器投屏设
- Win11怎么检查TPM2.0模块_Windows
- c# F# 的 MailboxProcessor
- Python模块的__name__属性如何由导入方
- 如何使用Golang配置安全开发环境_防止敏感信息
- php嵌入式多设备通信怎么实现_php同时管理多个
- Mac怎么开启“任何来源”_Mac安装未签名应用的

QQ客服