Go map是基于哈希表实现的无序键值对集合,非线程安全,需初始化后使用;支持增删改查、range遍历(顺序不固定),注意nil map读安全但写panic,结构体作key须可比较,并发需加锁。
Go 语言中的 map 是一种内置的无序键值对集合,底层基于哈希表实现,支持快速查找、插入和删除。它不是线程安全的,使用前必须初始化,否则会 panic。
定义 map 类型需指定键(key)和值(value)的类型,语法为 map[keyType]valueType。但仅声明不初始化会导致 nil map,无法直接赋值。
ages := make(map[string]int)
users := make(map[string]string, 10)
config := map[string]interface{}{"debug": true, "port": 8080}
var m map[int]string; m[1] = "a" —— 必须先 make
map 的常用操作简洁直观,但要注意“查”操作会同时返回值和是否存在标志,避免误判零值。
ages["alice"] = 30(存在则覆盖,不存在则新增)if age, ok := ages["bob"]; ok { fmt.Println(age) } —— ok 判断键是否存在delete(ages, "alice")(删除不存在的键无副作用)len(ages)(注意:不能取 cap)使用 for range 遍历,顺序不固定(每次运行可能不同),这是 Go 的设计特性,不可依赖顺序。
for name := range ages { fmt.Println(name) }
for name, age := range ages { fmt.Printf("%s: %d\n", name, age) }
sort.Strings() 处理 string 键)map 在实际使用中容易忽略一些关键细节,导致 panic 或逻辑错误。
var m map[string]int; v, ok := m["x"] 是安全的,但 m["x"] = 1 会 panicmake 或赋新 map 不影响原变量sync.RWMutex 或 sync.Map 替代,后者适用于读多写少场景)基本上就这些。掌握初始化、安全查询、遍历习惯和并发意识,就能稳稳用好 Go 的 map。