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 来组织和处理键值数据。