Go Map 集合
map 是键值对(key/value)集合,类似字典。键必须可比较(string、int 等),值任意。声明格式:map[键类型]值类型。(说明:文中的片段代码需放进完整程序里运行)
声明与初始化
完整示例:
package main
import "fmt"
func main() {
scores := make(map[string]int) // make 创建空 map
scores["语文"] = 90
city := map[string]string{ // 字面量初始化
"北京": "首都",
"上海": "魔都",
}
fmt.Println(scores, city)
var m map[string]int // 只声明 = nil map
fmt.Println(m == nil)
// m["英语"] = 80 // panic:不能写入 nil map
}
// 输出:
// map[语文:90] map[北京:首都 上海:魔都]
// true
map 使用前必须用 make 或字面量初始化,否则是 nil map,写入会 panic。
增、删、改、查
m := map[string]int{"语文": 90}
m["数学"] = 85 // 增:键不存在则插入
m["语文"] = 95 // 改:键已存在则覆盖
fmt.Println(m) // map[数学:85 语文:95]
v := m["语文"] // 查:按键取值
fmt.Println(v) // 95
delete(m, "数学") // 删:键不存在也不报错
fmt.Println(m) // map[语文:95]
判断键是否存在
读不存在的键不报错,返回零值。要区分"不存在"和"值本来就是零",用双返回值 v, ok:
m := map[string]int{"语文": 0, "数学": 85}
v, ok := m["数学"] // 键存在
fmt.Println(v, ok) // 85 true
v2, ok2 := m["英语"] // 键不存在
fmt.Println(v2, ok2) // 0 false:值是零值 0
遍历 map
用 range 遍历键值对;只要键就写 for k := range m。注意遍历顺序随机,不要依赖顺序:
m := map[string]string{"a": "1", "b": "2", "c": "3"}
for k, v := range m {
fmt.Printf("%s=%s ", k, v)
}
fmt.Println("个数:", len(m)) // len 也能统计 map
// 输出(键的顺序每次可能不同):
// c=3 a=1 b=2 个数: 3
并发注意(一句话)
map 不是并发安全的:多个 goroutine 同时读写会直接 panic,并发场景要加锁或改用 sync.Map(见并发篇)。
小结:增 m[k]=v、删 delete(m, k)、查用 v, ok;记住"先初始化、遍历无序、并发不安全"即可。