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;记住"先初始化、遍历无序、并发不安全"即可。

笔记加载中…