08 map
2025/9/25大约 2 分钟
08 map
Map 是一种内置的数据结构,它是一个无序的键值对的集合,在其他语言中,Map 也被称为字典、关联数组或哈希表。Go 语言的 map 是引用类型,必须初始化后才能使用。
基本概念
Map 类型的零值为 nil,nil map 既不能读取也不能写入。
var m1 map[string]int
fmt.Println(m1 == nil) // true
Map 的类型表示为 map[KeyType]ValueType
,其中:
- KeyType: 键的类型,必须是支持相等比较运算符的类型
- ValueType: 值的类型,可以是任意类型
创建 Map
使用 make
// 创建一个空的 map
m1 := make(map[string]int, 2)
m1["张三"] = 90
m1["李四"] = 85
fmt.Println(m1) // map[张三:90 李四:85]
在声明时填充
userInfo := map[string]int{
"张三": 90,
"李四": 85,
"王五": 92,
}
fmt.Println(userInfo)
基本操作
判断键是否存在
Go 语言中有个判断 map 中键是否存在的特殊语法,格式如下:
value, ok := map[key]
其中:
- value: 如果 key 存在则为对应的值,如果不存在则为该类型的零值
- ok: bool 类型,true 表示键存在,false 表示键不存在
userInfo := map[string]int{
"张三": 90,
"李四": 85,
}
// 查询张三的成绩
score, ok := userInfo["张三"]
if ok {
fmt.Println("张三的成绩:", score)
} else {
fmt.Println("查无此人")
}
遍历 Map
使用 for range
遍历 map:
userInfo := map[string]int{
"张三": 90,
"李四": 85,
"王五": 92,
}
// 遍历键值对
for name, score := range userInfo {
fmt.Printf("姓名: %s,成绩: %d\n", name, score)
}
// 只遍历键
for name := range userInfo {
fmt.Println("姓名:", name)
}
// 只遍历值
for _, score := range userInfo {
fmt.Println("成绩:", score)
}
注意:Map 的遍历是无序的,每次运行程序遍历的顺序可能都不同,但有时我们需要按照一定的顺序遍历,此时我们可以先获取所有键,对键进行排序,然后按排序后的键遍历。
删除键值对
使用内置函数 delete(map, key)
:
userInfo := map[string]int{
"张三": 90,
"李四": 85,
"王五": 92,
}
delete(userInfo, "张三")
fmt.Println(userInfo) // map[李四:85 王五:92]
删除不存在的键不会报错,但是也不会有任何效果。
值为 Map 的切片
如果说一个切片的类型为 Map,那么在操作某个位置时,需要先进行初始化,然后才能操作,否则就会 panic:
var mapSlice = make([]map[string]int, 3)
// 对切片中的 map 元素进行初始化
mapSlice[0] = make(map[string]int, 10)
mapSlice[0]["张三"] = 90
mapSlice[0]["李四"] = 85
for index, value := range mapSlice {
fmt.Printf("index:%d value:%v\n", index, value)
}
如果一个 Map 的值是切片呢,这种情况是否需要用 make 初始化所有的切片?可以自行试试。