如何在Golang中使用map_Golang映射类型操作方法
发布时间 - 2026-01-24 00:00:00 点击率:次Go 中 map 非线程安全,多 goroutine 读写会 panic;需用 make 或字面量初始化防 nil panic;遍历无序且禁止边遍历边删除;sync.Map 适用于多读少写场景,但类型不安全且功能受限。
Go 里的 map 不是线程安全的,直接在多 goroutine 中读写会触发 panic:"fatal error: concurrent map read and map write"。这是绝大多数新手踩的第一个坑,也是最该优先确认的点。
声明和初始化 map 要避免 nil 指针 panic
声明但未初始化的 map 是 nil,对它做 delete 或赋值不会报错,但读取(如 v, ok := m["key"])虽能运行,遍历时却会 panic。更隐蔽的是,向 nil map 写入会直接 panic。
- 正确方式是用
make显式初始化:userMap := make(map[string]int)
- 或用字面量初始化:
config := map[string]string{"host": "localhost", "port": "8080"} - 判断是否为
nil可用m == nil,但更常见的是直接检查 key 是否存在:if val, ok := userMap["id"]; ok { /* 使用 val */ }
遍历 map 时无法保证顺序,且迭代中不能删元素
Go 的 map 迭代顺序是随机的(从 Go 1.0 起就刻意如此),每次运行结果都可能不同。这不是 bug,是设计选择——防止程序依赖隐式顺序。
- 需要固定顺序(比如按 key 排序输出),得先收集 key 到 slice,再排序:
keys := make([]string, 0, len(m)) for k := range m { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { fmt.Println(k, m[k]) } - 遍历时禁止调用
delete(m, k),否则行为未定义(可能跳过元素、重复遍历,甚至 panic)。要删元素,先收集待删 key,循环结束后再删。
用 sync.Map 替代普通 map 实现并发安全
标准库 sync.Map 是专为“多读少写”场景优化的并发安全 map,但它不是通用替代品:不支持 len()、不能直接 range 遍历、API 更冗长,且底层用分片锁 + read/write map 双结构实现。
- 适用场景:
cache类逻辑(如请求 ID → 处理状态)、配置热更新等;不适用于 高频写入或需要遍历全部键值的场景。 - 基本用法:
var m sync.Map m.Store("user_123", &User{ID: 123}) if val, ok := m.Load("user_123"); ok { u := val.(*User) } m.Delete("user_123") - 注意:
sync.Map的Load/Store接口参数类型是interface{},没有类型安全,容易因类型断言失败 panic,务必校验
ok。
真正麻烦的从来不是语法怎么写,而是搞清「这个 map 会被谁读、谁写、频率如何、是否跨 goroutine」——没想清楚这点,用 sync.Map 可能比加 sync.RWMutex 更慢,而裸用普通 map 又必然崩溃。
# go
# golang
# app
# 标准库
# Error
# 循环
# 指针
# 接口
# Interface
# 线程
# len
# nil
# map
# delete
# 并发
# bug
# 遍历
# 的是
# 这是
# 迭代
# 第一个
# 适用于
# 这不是
# 不支持
# 报错
# 但它
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
EditPlus 正则表达式 实战(3)
Thinkphp 中 distinct 的用法解析
重庆市网站制作公司,重庆招聘网站哪个好?
python中快速进行多个字符替换的方法小结
如何用狗爹虚拟主机快速搭建网站?
Android滚轮选择时间控件使用详解
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Python文本处理实践_日志清洗解析【指导】
北京企业网站设计制作公司,北京铁路集团官方网站?
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
如何基于云服务器快速搭建个人网站?
详解jQuery中基本的动画方法
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
高端企业智能建站程序:SEO优化与响应式模板定制开发
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
三星网站视频制作教程下载,三星w23网页如何全屏?
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
Python数据仓库与ETL构建实战_Airflow调度流程详解
敲碗10年!Mac系列传将迎来「触控与联网」双革新
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
如何在IIS7中新建站点?详细步骤解析
如何自定义建站之星网站的导航菜单样式?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】
千库网官网入口推荐 千库网设计创意平台入口
中山网站推广排名,中山信息港登录入口?
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
,怎么在广州志愿者网站注册?
Android使用GridView实现日历的简单功能
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何快速搭建高效可靠的建站解决方案?
魔方云NAT建站如何实现端口转发?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
HTML 中如何正确使用模板变量为元素的 name 属性赋值
如何打造高效商业网站?建站目的决定转化率
详解Android——蓝牙技术 带你实现终端间数据传输
如何解决hover在ie6中的兼容性问题
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
如何在香港服务器上快速搭建免备案网站?
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
如何在阿里云部署织梦网站?
Laravel如何使用Blade模板引擎?(完整语法和示例)
上一篇:gitee上的开源许可证怎么选
上一篇:gitee上的开源许可证怎么选


