Go语言之Map 的基本操作-《Go语言实战指南》

map 是 Go 语言中内建的哈希表(hash table)数据结构,用于存储无序的 key-value 键值对。Go 的 map 使用方便、功能强大,是日常开发中的重要工具。


一、map 的定义

基本语法:
复制代码
var m map[keyType]valueType

keyType 可比较类型(如:int、string、bool),valueType 可为任意类型。

示例:
复制代码
var scores map[string]int

此时 scores 为 nil,尚未分配内存,不能直接赋值。


二、初始化 map

使用 make 函数:
复制代码
scores := make(map[string]int)

或指定容量(底层做预分配优化):

复制代码
scores := make(map[string]int, 10)
使用字面量:
复制代码
scores := map[string]int{
    "Alice": 90,
    "Bob":   85,
}

三、添加和更新键值对

直接通过 map[key] = value 语法添加或更新:

复制代码
scores["Charlie"] = 95  // 添加新键值
scores["Alice"] = 99    // 更新已有键值

四、访问 map 中的值

复制代码
fmt.Println(scores["Alice"]) // 输出 99

如果 key 不存在,返回值类型的零值:

复制代码
fmt.Println(scores["Unknown"]) // 输出 0(因为值类型是 int)

五、判断 key 是否存在

Go 提供双赋值语法判断键是否存在:

复制代码
value, ok := scores["Bob"]
if ok {
    fmt.Println("Bob's score is", value)
} else {
    fmt.Println("Bob not found")
}

六、删除键值对

使用 delete(map, key) 函数:

复制代码
delete(scores, "Charlie")

删除不存在的 key 不会报错,是安全操作。


七、遍历 map

使用 for-range 遍历键值对(无序):

复制代码
for name, score := range scores {
    fmt.Printf("%s: %d\n", name, score)
}

遍历顺序是随机的,每次运行可能都不同。


八、map 是引用类型

赋值或传参时,多个变量指向同一个底层数据:

复制代码
m1 := map[string]int{"a": 1}
m2 := m1
m2["a"] = 100
fmt.Println(m1["a"]) // 输出 100

九、map 不支持的操作

  • • 不能使用 == 比较两个 map(只能与 nil 比较)
  • • 不支持 len(map) 修改元素数量,但可以用 len(m) 获取当前键数量
  • • map 的 key 必须是可比较类型,如不能使用切片、map、函数作为 key

十、总结

操作 方法
创建 map make(map[KeyType]ValueType)
添加/更新 m[key] = value
读取 value := m[key]
判断存在 value, ok := m[key]
删除键 delete(m, key)
遍历 for k, v := range m

掌握这些基础操作后,你就能高效地在 Go 中使用 map 来组织和处理键值数据。

相关推荐
程序猿DD3 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
余槐i6 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8266 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
死磕音视频7 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林7 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne8 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF8 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li9 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
顽疲9 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友