如何在Golang中使用map存储键值对_创建、访问和遍历Map
发布时间 - 2025-12-27 00:00:00 点击率:次Go语言map是无序键值对集合,需声明后make初始化;键必须支持==比较(如string、int),不可用切片、map或函数;遍历顺序随机,线程不安全,nil map读写会panic。
Go语言中的map是无序的键值对集合,必须先声明再使用(不能像切片那样直接字面量赋值给未声明变量),且键类型必须支持==比较(如string、int、bool、指针等,但不能是切片、map或函数)。
创建Map:三种常用方式
推荐显式初始化,避免nil map导致运行时panic:
-
声明+make初始化(最常用):
ages := make(map[string]int) -
字面量初始化(带初始值):
colors := map[string]string{"red": "#ff0000", "blue": "#0000ff"} -
声明后赋值(不推荐用于空map):
var scores map[string]int
scores = make(map[string]int) // 必须make,否则为nil
访问和修改Map元素
通过键名访问值,语法简洁,但需注意“不存在的键”会返回零值,不报错:
-
读取值:
age := ages["Alice"]→ 若"Alice"不存在,age为0(int零值) -
安全读取(判断是否存在):
if age, ok := ages["Bob"]; ok { fmt.Pri
ntln("Bob is", age) }
其中ok为bool,仅当键存在时为true -
添加/更新元素:
ages["Charlie"] = 30(键存在则覆盖,不存在则插入) -
删除元素:
delete(ages, "Alice")(删除不存在的键无副作用)
遍历Map:用for-range,顺序不保证
Go中map遍历顺序是随机的(每次运行可能不同),如需固定顺序,需额外排序键:
-
基础遍历(键+值):
for name, age := range ages { fmt.Printf("%s: %d\n", name, age) } -
只遍历键:
for name := range ages { fmt.Println(name) } -
只遍历值:
for _, age := range ages { fmt.Println(age) }(用_忽略键) -
按字母序遍历(需先收集并排序键):
var keys []string
for k := range ages { keys = append(keys, k) }
sort.Strings(keys)
for _, k := range keys { fmt.Printf("%s: %d\n", k, ages[k]) }
注意事项与常见陷阱
使用map时几个关键细节容易出错:
-
nil map不可写也不可读(除len和cap外):未
make的map是nil,直接赋值会panic;len(nilMap)返回0,是安全的 -
map是引用类型,但不是线程安全的:多个goroutine同时读写需加锁(如
sync.RWMutex)或使用sync.Map(适用于读多写少场景) -
结构体作为键需所有字段可比较:
type Key struct{ A int; B string }✅
m := make(map[Key]bool)
但若含切片字段则非法 ❌ - 不要用float64作键:浮点数精度问题可能导致预期外的不相等,建议转为字符串或整数表示
# go
# golang
# go语言
# app
# 键值对
# red
# String
# if
# sort
# for
# printf
# 字符串
# 结构体
# bool
# int
# 指针
# 引用类型
# Struct
# 线程
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
如何获取上海专业网站定制建站电话?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
深入理解Android中的xmlns:tools属性
Laravel如何与Pusher实现实时通信?(WebSocket示例)
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
Laravel如何生成API文档?(Swagger/OpenAPI教程)
javascript如何操作浏览器历史记录_怎样实现无刷新导航
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
Internet Explorer官网直接进入 IE浏览器在线体验版网址
制作电商网页,电商供应链怎么做?
Win11怎么开启自动HDR画质_Windows11显示设置HDR选项
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
EditPlus中的正则表达式实战(5)
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Laravel如何创建自定义Artisan命令?(代码示例)
如何快速生成可下载的建站源码工具?
详解阿里云nginx服务器多站点的配置
实现点击下箭头变上箭头来回切换的两种方法【推荐】
Laravel怎么在Blade中安全地输出原始HTML内容
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
移动端脚本框架Hammer.js
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
如何用PHP工具快速搭建高效网站?
php打包exe后无法访问网络共享_共享权限设置方法【教程】
Laravel如何实现本地化和多语言支持?(i18n教程)
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
如何在云虚拟主机上快速搭建个人网站?
英语简历制作免费网站推荐,如何将简历翻译成英文?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
浅谈javascript alert和confirm的美化
HTML 中如何正确使用模板变量为元素的 name 属性赋值
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
如何在自有机房高效搭建专业网站?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
浅谈redis在项目中的应用
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
如何用AWS免费套餐快速搭建高效网站?
javascript日期怎么处理_如何格式化输出
如何快速搭建二级域名独立网站?
EditPlus中的正则表达式 实战(2)
制作旅游网站html,怎样注册旅游网站?
EditPlus中的正则表达式实战(6)
Laravel Docker环境搭建教程_Laravel Sail使用指南
如何快速配置高效服务器建站软件?
Python文件流缓冲机制_IO性能解析【教程】
如何用PHP快速搭建高效网站?分步指南


ntln("Bob is", age) }