【Go 从入门到精通】第 6 章:字典(map)
上一章我们学了数组和切片——它们都是「按下标找元素」:第 0 个、第 1 个、第 2 个……但生活中更多时候我们是「按名字找人」:查「小明的成绩」、查「北京的天气」。这种「键 → 值」的对应关系,Go 里用 map(字典)来表示。
这一章讲 map 的创建、增删改查、遍历,以及它最著名的两个坑:对 nil map 写入会 panic、并发读写会崩。学完这章,你就能轻松应对「按名字查数据」这类需求了。
一、map 是什么:按「名字」找数据
map 是**键值对(key-value)**的集合,像一本字典:根据「键」快速查到「值」。
// key 是 string(名字),value 是 int(分数)
scores := map[string]int{
"小明": 90,
"小红": 85,
}
fmt.Println(scores["小明"]) // 90
对比一下数组/切片和 map 的定位:
| 结构 | 怎么找元素 | 例子 |
|---|---|---|
| 数组 / 切片 | 按下标(0、1、2…) | s[0] |
| map | 按 key(任意可比较类型) | scores["小明"] |
💡 简单记:数组是「排排坐,按号找」,map 是「按名字,叫谁谁应」。
二、创建 map
2.1 用 make 创建(最常用)
m := make(map[string]int) // key 是 string,value 是 int
m["a"] = 1
map[string]int 表示「键是 string、值是 int 的 map」,冒号前后分别是 key 和 value 的类型。
💡
make还可以带第二个参数预估容量:make(map[string]int, 100)表示「预计装 100 个键值对」,提前分配好底层空间、减少后续扩容次数。注意这只是预估(hint),不是硬性上限——超过 100 个照样能存。
2.2 用字面量创建(带初始值)
m := map[string]int{
"a": 1,
"b": 2,
}
注意上面最后一行 "b": 2, 末尾的逗号不能省——Go 规定:多行复合字面量里,最后一个元素后必须有逗号。如果写成单行,最后一个元素后的逗号可以省略:
m := map[string]int{
"a": 1, "b": 2} // ✅ 单行可以省略末尾逗号
2.3 nil map:只声明不初始化(大坑!)
map 的零值是 nil。只声明不初始化的 map 是 nil,向它写入会直接 panic:
var m map[string]int // m 是 nil map
m["a"] = 1 // ❌ panic: assignment to entry in nil map
⚠️ 重点:声明后必须用
make或字面量初始化才能写:var m map[string]int m = make(map[string]int) // 先初始化 m["a"

&spm=1001.2101.3001.5002&articleId=165603903&d=1&t=3&u=1650111210d84a7fb7e1b003e8c96818)
3372

被折叠的 条评论
为什么被折叠?



