目录
[1. Map的概念](#1. Map的概念)
[2. Map的增删查改](#2. Map的增删查改)
[2.1 新增 / 修改](#2.1 新增 / 修改)
[2.2 查询](#2.2 查询)
[2.3 删除](#2.3 删除)
[2.4 遍历](#2.4 遍历)
[3. Map元素排序](#3. Map元素排序)
[4. Map切片](#4. Map切片)
1. Map的概念
map 是一种 键值对(key-value) 的无序集合,类似于C++ 里的 哈希表
-
Key(键) :必须是支持比较的类型(如
int
、string
、bool
、指针等)。不能用slice
、map
、function
作为 key。 -
Value(值):可以是任意类型(包括切片、结构体、函数等)。
-
无序:Map 的迭代顺序是随机的,每次遍历结果可能不同。
1. 使用
make
创建
m := make(map[string]int)
m["苹果"] = 1
m["香蕉"] = 2
fmt.Println(m) // map[苹果:1 香蕉:2]
2. 使用字面量创建
m := map[string]string{
"apple": "苹果",
"hello": "你好",
}
fmt.Println(m) // map[apple:苹果 hello:你好]
2. Map的增删查改
2.1 新增 / 修改
-
语法:
map[key] = value
-
如果 key 不存在 → 新增
-
如果 key 已存在 → 更新
m := map[string]string{ "apple": "苹果", "hello": "你好", } m["pear"] = "梨" // key 不存在 → 新增 m["hello"] = "哈喽" // key 已存在 → 更新 fmt.Println(m) // map[apple:苹果 hello:哈喽 pear:梨]
2.2 查询
-
直接用
map[key]
取值 -
如果 key 不存在 → 返回该 value 类型的 零值
-
想区分 "零值" 和 "不存在" → 用
value, ok := map[key]
m := map[string]string{ "apple": "苹果", "hello": "你好", } // 查询存在的 key fmt.Println(m["apple"]) // 苹果 // 查询不存在的 key fmt.Println(m["pear"]) // "" (string 的零值) // 判断 key 是否存在 a, ok1 := m["apple"] fmt.Println(a, ok1) // 苹果 true b, ok2 := m["pear"] fmt.Println(b, ok2) // "" false
2.3 删除
-
使用内建函数
delete(map, key)
-
删除不存在的 key 不会报错
m := map[string]string{ "apple": "苹果", "hello": "你好", } delete(m, "apple") fmt.Println(m) // map[hello:你好]
2.4 遍历
-
map中的键值对是无序的,每次遍历map得到的键值对序列都是不可预测的。
m := map[string]string{ "apple": "苹果", "hello": "你好", } for k, v := range m { fmt.Printf("key=%s, value=%s\n", k, v) }
3. Map元素排序
Map 是无序的 ,遍历顺序是随机的(即使多次遍历同一个 map
,顺序也可能不一样)。
如果我们想对 map
里的 key 或 value 排序 ,需要 先把 key 或 value 拷贝出来放到切片中,再排序。
m := map[int]string{
1: "周一",
7: "周日",
3: "周三",
2: "周二",
5: "周五",
4: "周四",
6: "周六",
}
// 1. 获取map中所有的key
var key []int
for k := range m {
key = append(key, k)
}
// 2. 排序key值
sort.Ints(key)
// 3. 遍历key
for _, k := range key {
fmt.Println(k, m[k])
}
4. Map切片
切片和 map 是两种不同的数据结构:
-
map
是键值对集合 -
slice
是动态数组
map 切片 ,就是一个 切片,切片的每个元素是 map。
[]map[keyType]valueType
// map 切片 = 切片的每个元素是 map
这种结构常用于存储 多个 map 的集合,例如多个学生的信息,每个学生的信息用一个 map 表示,所有学生放到一个切片里。
var a = make([]map[string]int, 2)
a[0] = make(map[string]int)
a[0]["赵一"] = 1
a[0]["王二"] = 2
a[1] = make(map[string]int)
a[1]["张三"] = 3
a[1]["李四"] = 4
for i, v := range a {
fmt.Println(i, v)
}
/*
0 map[王二:2 赵一:1]
1 map[张三:3 李四:4]
*/
追加 map
// 定义一个空切片
var users []map[string]string
// 追加 map
users = append(users, map[string]string{"name": "Tom", "age": "18"})
users = append(users, map[string]string{"name": "Jerry", "age": "20"})
users = append(users, map[string]string{"name": "Alice", "age": "22"})
// 遍历
for _, user := range users {
fmt.Println(user)
}