Go映射(map)
Go映射是键值对的无序集合,键唯一,值可重复。
map声明与初始化
声明语法
Go
// 声明map(nil map,不能直接使用)
var m map[string]int
// 声明并初始化
var m = map[string]int{"a": 1, "b": 2}
// 短声明初始化
m := map[string]int{"a": 1, "b": 2}
// make初始化
m := make(map[string]int)
m := make(map[string]int, 10) // 预分配容量
nil map不能写入,必须先初始化。
基本操作
Go
m := make(map[string]int)
// 增:添加键值对
m["a"] = 1
m["b"] = 2
// 改:修改值
m["a"] = 10
// 查:获取值
v := m["a"]
fmt.Println(v) // 10
// 删:删除键值对
delete(m, "a")
读取与检查
获取值
Go
m := map[string]int{"a": 1}
// 直接获取
v := m["a"] // 1
// 获取不存在的键
v := m["x"] // 0(零值)
读取不存在的键返回值类型的零值,不报错。
检查键是否存在
Go
m := map[string]int{"a": 1}
// ok返回键是否存在
v, ok := m["a"]
if ok {
fmt.Println("存在:", v)
}
v, ok := m["x"]
if !ok {
fmt.Println("不存在")
}
使用ok模式判断键是否存在。
map遍历
for range遍历
Go
m := map[string]int{"a": 1, "b": 2, "c": 3}
// 遍历键值对
for key, value := range m {
fmt.Println(key, value)
}
// 只遍历键
for key := range m {
fmt.Println(key)
}
map遍历顺序随机,每次遍历顺序可能不同。
map类型限制
键类型限制
Go
// ✓ 键可以是:基本类型、指针、struct、数组
m := map[int]string{}
m := map[string]int{}
m := map[Point]int{} // struct作为键
// ✗ 键不能是:slice、map、函数(不可比较)
m := map[[]int]string{} // 编译错误
m := map[map[int]int]string{} // 编译错误
键类型必须可比较(支持==和!=)。
值类型任意
Go
// 值可以是任意类型
m := map[string]int{}
m := map[string][]int{} // 值是slice
m := map[string]map[int]int{} // 值是map
m := map[string]interface{}{} // 值是任意类型
map操作示例
Go
func main() {
// 创建map
scores := make(map[string]int)
// 添加
scores["Tom"] = 85
scores["Jerry"] = 90
// 修改
scores["Tom"] = 88
// 查找
score, ok := scores["Tom"]
if ok {
fmt.Println("Tom成绩:", score)
}
// 删除
delete(scores, "Jerry")
// 遍历
for name, score := range scores {
fmt.Println(name, score)
}
// 获取长度
fmt.Println("数量:", len(scores))
}
map常用操作表
| 操作 | 语法 | 说明 |
|---|---|---|
| 创建 | make(map[K]V) | 初始化map |
| 添加 | m[key] = value | 添加键值对 |
| 获取 | m[key] | 获取值(不存在返回零值) |
| 检查 | v, ok := m[key] | 判断键是否存在 |
| 修改 | m[key] = value | 修改已存在的键 |
| 删除 | delete(m, key) | 删除键值对 |
| 遍历 | for k, v := range m | 随机顺序遍历 |
| 长度 | len(m) | 键值对数量 |
要点总结
- map是键值对集合,键唯一
- nil map不能写入,需先初始化
- make或复合字面量初始化map
- 读取不存在键返回零值
- 用v, ok := m[key]判断键是否存在
- delete删除键值对
- range遍历顺序随机
- 键必须可比较,slice/map/函数不能作键
- 值可以是任意类型
📝 发现内容有误?点击此处直接编辑