Go Map

map

map 是 Go 中的哈希表(hash table),與 Python 中的 dict 類似。不過,Go 的 map 需要事先定義 key 和 value 的資料型別,並且 key 和 value 必須是相同資料型別的集合。

map 的型態如下

map[KeyType]ValueType

宣告

var m map[string][int]
m = make(map[string]int)

在 Go 中,使用 var 宣告一個 map 時,會得到一個 nil map,也就是尚未初始化的狀態。 若在未經初始化的情況下對 map 進行寫入操作(例如新增鍵值對),會得到錯誤訊息: panic: assignment to entry in nil map 因此,必須使用 make 函數來初始化 map 才能進行寫入。

m := map[string]int{}

也可以使用 := 來直接建立空 map,透過此方式建立的 map 可以直接進行寫入。

修改/新增

m["apple"] = 3

map 可以直接透過 key 來新增或修改元素。

查詢

m["apple"]
i := m["apple"]

map 可以直接透過 key 來查詢值,若是 key 不存在,會得到值 0。

value,ok := m["apple"]

或著也可以透過兩個 assignment 的方法來確認 key 是否存在在 map。 value 會存放 key 所對應的值,若是 key 不存在於 map 則會是0。 ok 是布林值, true 表示 key 存在於 map, false 表示 key 不存在於 map。

_,ok := m["apple"]

如果希望在不檢索值的狀況下確認 key,可以使用 _ 。 這樣可以避免宣告了 value 卻沒使用,導致 go 編譯時報錯。

刪除

delete(m,"apple")

可以透過 delete 來刪除 key,delete 不會回傳任何東西,若是指定的 key 不存在 map ,則不會做任何事。

遍歷

map 是無序的,所以不能保證每次遍歷都可以是相同的順序。

package main

import "fmt"

func main() {
    m := map[string]int{
        "apple":  5,
        "banana": 2,
        "cherry": 7,
    }
    for key, value := range m {
        fmt.Println(key, value)
    }
}

可以透過以上的程式碼多跑幾次去測試。 第一次執行可能是

apple 5
banana 2
cherry 7

但第二次執行可能就變成

banana 2
cherry 7
apple 5

當然也有可能連續兩次執行都是相同順序,所以當有需要 map 以特定順序遍歷的時候,最好是另外儲存 key ,再對 key 進行 sort。

參考

https://go.dev/blog/maps

使用 Hugo 建立
主題 StackJimmy 設計