map 基础
本教程共 80 篇 · 第 32 篇 · 更新于 2026-07-27 · 约 7 分钟阅读
32. map 基础
本节目标:学会声明和创建 map,掌握增删改查四项基本操作,理解 map 的零值行为。
map 是什么
map(映射)就是键值对(key-value)的集合。给一个 key,能快速找到对应的 value。你可以把它想成一本通讯录:名字是 key,电话号码是 value。
Go 的 map 写法是 map[KeyType]ValueType,比如 map[string]int 表示 key 是字符串、value 是整数的 map。
创建 map 的三种方式
方式一:make
m := make(map[string]int)
m["apple"] = 5
m["banana"] = 3
fmt.Println(m) // map[apple:5 banana:3]
make(map[string]int) 创建一个空 map,可以直接用。
方式二:字面量
m := map[string]int{
"apple": 5,
"banana": 3,
"cherry": 8,
}
fmt.Println(m) // map[apple:5 banana:3 cherry:8]
注意每个键值对后面都要加逗号,包括最后一个。
方式三:var 声明(不能用)
var m map[string]int
m["apple"] = 5 // 报错!panic: assignment to entry in nil map
Warning
var m map[string]int声明出来的 map 是 nil。nil map 可以读(返回零值),但不能写。必须用 make 或字面量初始化后才能写入。
增删改查
增加
直接赋值就行,key 不存在就新增:
m := make(map[string]int)
m["apple"] = 5
m["banana"] = 3
修改
key 已存在的话,赋值就是覆盖:
m["apple"] = 10 // 把 apple 的值从5改成10
查询
用 key 取值,配合「逗号 ok」模式判断 key 是否存在:
package main
import "fmt"
func main() {
m := map[string]int{"apple": 5, "banana": 3}
// 方式一:直接取,不存在返回零值
fmt.Println(m["apple"]) // 5
fmt.Println(m["cherry"]) // 0 不存在返回int的零值
// 方式二:逗号ok模式,能区分"零值"和"不存在"
v, ok := m["cherry"]
if ok {
fmt.Println("cherry:", v)
} else {
fmt.Println("cherry 不存在")
}
}
Tip逗号 ok 模式非常重要。如果 map 里存的值本身可以是 0,你光看返回值 0 是没法区分「这个 key 不存在」还是「这个 key 的值就是 0」的。用
v, ok := m[key]就能准确判断。
删除
用内置函数 delete:
m := map[string]int{"apple": 5, "banana": 3}
delete(m, "apple")
fmt.Println(m) // map[banana:3]
// 删除不存在的key也不会报错
delete(m, "notexist")
map 的基本特性
长度
用 len() 获取 map 里键值对的数量:
m := map[string]int{"a": 1, "b": 2, "c": 3}
fmt.Println(len(m)) // 3
引用类型
和切片一样,map 也是引用类型。赋值给另一个变量,两者共享同一份数据:
m1 := map[string]int{"apple": 5}
m2 := m1
m2["apple"] = 100
fmt.Println(m1["apple"]) // 100 m1 也变了
key 的类型限制
map 的 key 必须是可比较的类型,也就是支持 == 操作的类型。可以用的有:
- 数字、字符串、布尔
- 数组、指针、channel
- 接口(如果底层类型可比较)
- 结构体(如果所有字段可比较)
不能用的有:
- 切片
- map
- 函数
这些类型不可比较,所以不能做 key。
Note浮点数虽然可以做 key,但不推荐。浮点数有精度问题,
NaN != NaN,可能导致意想不到的行为。
小结
map 的核心操作就四个字:增删改查。
- 创建用 make 或字面量,别用 var
- 增和改都是
m[key] = value - 查用
v, ok := m[key]判断存在性 - 删用
delete(m, key)
下一章讲 map 的进阶用法:遍历顺序、嵌套 map、以及 key 选择的注意事项。