Golang指针和map的使用区别_引用类型与指针对比说明
发布时间 - 2026-01-26 00:00:00 点击率:次map是引用类型,传值即可修改键值对;*map仅在需替换整个map实例(如nil初始化)时使用;值类型T存值更安全,指针类型T可避免复制。
Go 中 map 本身是引用类型,**不需要用指针就能修改其键值对**;而显式指针(如 *int)是真正用来改变变量本体的。混淆这两者,是新手最常踩的坑。
为什么传 map[string]int 就能改原数据,却不能传 *map[string]int?
因为 map 变量在底层存储的是一个指向 hmap 结构的指针(类似句柄),赋值或传参时复制的是这个句柄——轻量、共享数据、天然支持修改元素。
- 传
map[string]int:函数内执行m["k"] = v或delete(m, "k"),原始 map 立刻可见变化 - 传
*map[string]int:多了一层解引用,仅当你需要替换整个 map 实例(比如从nil初始化为新make出的 map)时才必要 -
标准库和主流项目(如
json.Unmarshal)全部按值接收map,没人写*map
什么时候真得用 *map[string]T?
极少数场景:你要让调用方的 map 变量“指向一个全新结构”,而不是只改内容。
- 初始化一个尚未分配的
nilmap:比如配置加载函数需内部创建并绑定到外部变量 - 结构体字段需支持“置为
nil”或“原子性替换整个 map”(如热重载配置) - 与其他字段统一使用指针(如
Options *map[string]string+Timeout *time.Duration)
示例:
func initMapIfNil(m *map[string]int) {
if *m == nil {
newMap := make(map[string]int)
newMap["default"] = 42
*m = newMap // ← 这步让调用方变量指向新 map
}
}
var myMap map[string]int
initMapIfNil(&myMap)
fmt.Println(myMap) // map[default:42]
map 值用指针 vs 值类型:关键在“改谁”
这里说的是 map[key]T 中的 T 是值类型还是指针类型——和 map 本身是否用指针无关。
- 若
T是大结构体(如type User struct{...}),存*User能避免复制,且多个 key 可共享同一实例 - 若
T是int或小 struct,存值更简单、无 nil 风险、GC 更友好 - 错误示范:
m["x"].Name = "new"—— 如果m的值类型是User(非指针),这只会改副本,原 map 不变
最容易被忽略的一点:nil map 可以安全读(返回零值),但任何写操作都会 panic;这个行为跟是否传指针完全无关,只取决于 map 是否被 make 过。别指望用 *map 来绕过这个问题。
# js
# json
# go
# golang
# 区别
# 键值对
# 标准库
# 为什么
# golang指针
# String
# 结构体
# int
# 指针
# 值类型
# 引用类型
# 指针类型
# Struct
# nil
# map
# delete
# 的是
# 就能
# 句柄
# 键值
# 多个
# 什么时候
# 当你
# 没人
# 这个问题
# 要用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
SQL查询语句优化的实用方法总结
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何在建站宝盒中设置产品搜索功能?
太平洋网站制作公司,网络用语太平洋是什么意思?
IOS倒计时设置UIButton标题title的抖动问题
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
智能起名网站制作软件有哪些,制作logo的软件?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Laravel distinct去重查询_Laravel Eloquent去重方法
猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
Laravel怎么上传文件_Laravel图片上传及存储配置
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
如何用VPS主机快速搭建个人网站?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
使用Dockerfile构建java web环境
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
详解jQuery中基本的动画方法
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel如何实现多对多模型关联?(Eloquent教程)
网站制作软件有哪些,制图软件有哪些?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
中山网站推广排名,中山信息港登录入口?
C#如何调用原生C++ COM对象详解
Java解压缩zip - 解压缩多个文件或文件夹实例
简单实现Android文件上传
node.js报错:Cannot find module 'ejs'的解决办法
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
使用豆包 AI 辅助进行简单网页 HTML 结构设计
如何快速选择适合个人网站的云服务器配置?
Laravel如何实现模型的全局作用域?(Global Scope示例)
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
Android自定义listview布局实现上拉加载下拉刷新功能
zabbix利用python脚本发送报警邮件的方法
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框


