Map 是鍵值對的集合,提供常數時間的查找、插入與刪除。
基本操作#
// 建立
m1 := make(map[string]int)
m2 := map[string]int{
"apple": 5,
"banana": 3,
}
// 操作
m1["key"] = 10 // 插入/更新
value := m1["key"] // 讀取
delete(m1, "key") // 刪除
value, ok := m1["key"] // 檢查是否存在鍵型別限制#
Map 的鍵型別必須是可比較的(comparable)。以下型別不能作為鍵:
- 函式型別
- Map 型別
- 切片型別
// 合法
map[int]string // 整數
map[string]int // 字串
map[[3]int]string // 陣列(固定長度)
map[struct{x,y int}]int // 結構體(欄位都可比較)
// 非法
// map[[]int]string // 切片不可比較
// map[func()]string // 函式不可比較
// map[map[int]int]int // map 不可比較零值與 nil#
var m map[string]int // nil map
// 讀取 nil map 不會 panic
v := m["key"] // v = 0(零值)
// 寫入 nil map 會 panic!
// m["key"] = 1 // panic: assignment to entry in nil map
// 必須先初始化
m = make(map[string]int)
m["key"] = 1 // 正常遍歷#
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 的遍歷順序是隨機的。需要有序遍歷時,必須先把鍵排序:
keys := make([]string, 0, len(m)) for k := range m { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { fmt.Println(k, m[k]) }