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])
}