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"] = vdelete(m, "k"),原始 map 立刻可见变化
  • *map[string]int:多了一层解引用,仅当你需要替换整个 map 实例(比如从 nil 初始化为新 make 出的 map)时才必要
  • 标准库和主流项目(如 json.Unmarshal)全部按值接收 map,没人写 *map

什么时候真得用 *map[string]T

极少数场景:你要让调用方的 map 变量“指向一个全新结构”,而不是只改内容。

  • 初始化一个尚未分配的 nil map:比如配置加载函数需内部创建并绑定到外部变量
  • 结构体字段需支持“置为 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 可共享同一实例
  • Tint 或小 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)中防止键盘遮挡底部输入框