如何在Golang中使用map存储键值对_创建、访问和遍历Map

发布时间 - 2025-12-27 00:00:00    点击率:
Go语言map是无序键值对集合,需声明后make初始化;键必须支持==比较(如string、int),不可用切片、map或函数;遍历顺序随机,线程不安全,nil map读写会panic。

Go语言中的map是无序的键值对集合,必须先声明再使用(不能像切片那样直接字面量赋值给未声明变量),且键类型必须支持==比较(如stringintbool、指针等,但不能是切片、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"不存在,age0int零值)
  • 安全读取(判断是否存在)
    if age, ok := ages["Bob"]; ok { fmt.Println("Bob is", age) }
    其中okbool,仅当键存在时为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快速搭建高效网站?分步指南