Go Map
Map 是 Go 的键值映射结构,用于快速按键访问数据,但其零值、写入规则和遍历特征需要单独建立直觉。
#type / concept
#status / growing
#tech / dev
#resource / go
[!info] related notes
- 所属 MOC: Go 语言基础 MOC
- 前置概念: Go 基本类型, Go 的变量、常量与零值
- 并列概念: Go Slice
Go Map
一句话定义
Map 是 Go 用于按键快速查找值的内建哈希映射结构,但它的零值、写入行为和遍历顺序都不能套用“普通对象字面量”的直觉来理解。
核心机制 / 工作原理
Map 最常见的特征有:
- 通过键访问值
- 零值是
nil - 需要
make后才能安全写入 - 遍历顺序不保证稳定
最小例子 / 最小场景
scores := make(map[string]int)
scores["alice"] = 95
value, ok := scores["bob"]
fmt.Println(value, ok) // 0 false
这段代码体现了两个 Go 高频点:
- 读不存在的键不会报错,而是返回值类型零值
ok用来区分“值本身刚好是零值”还是“键不存在”
为什么这部分重要
Go 里缓存、索引、去重、计数、聚合逻辑大量依赖 map。很多 bug 并不来自 API 不会用,而是没有意识到零值和存在性判断是两回事。
边界与易混淆点
nilmap 可读但不可写- map 遍历顺序不稳定,不能把它当作有序结构
- 并发读写 map 需要额外同步,不能想当然地跨 goroutine 直接共享写入