Go 基礎篇之 Map

程式設計師祝融發表於2023-02-21

Go 語言是一門非常流行的開源程式語言,它的語法簡單易學,同時也具有出色的效能表現。其中,Map 是 Go 語言中的一種資料結構,它可以用來儲存鍵值對。今天我們來聊聊 Map,我將介紹一些關於 Go 語言中 Map 的基本知識和高階用法。

1. Map 基礎知識

1.1 什麼是 Map

在 Go 語言中,Map 是一種無序的鍵值對資料結構。它類似於Python中的字典,C++ 中的 Map,Java 中的HashMap 等。Map 中的每個元素都包含一個鍵和一個值。鍵必須是唯一的,而值則可以重複。

1.2 宣告一個 Map

在 Go 語言中,可以使用 make 函式來建立一個 Map。make 函式需要傳遞兩個引數,第一個引數是 Map 的型別,第二個引數是 Map 的初始大小。Map 的型別可以使用 Map 關鍵字來定義,例如:

// 建立一個型別為map[string]int的map,初始大小為10
m := make(map[string]int, 10)

上述程式碼將建立一個型別為 Map[string]int的 Map,其中鍵為字串型別,值為整數型別。初始大小為10,這個值可以根據實際需要進行調整。

1.3 新增元素到 Map 中

可以使用賦值運算子來向 Map 中新增元素。例如:

// 向map中新增元素
m["one"] = 1
m["two"] = 2

上述程式碼將向 Map 中新增兩個元素,鍵為"one" 和 "two",值分別為 1 和 2。

1.4 Map 中獲取元素

可以使用下標運算子來從Map中獲取元素。例如:

// 從map中獲取元素
fmt.Println(m["one"])
fmt.Println(m["two"])

上述程式碼將輸出 Map 中鍵為 "one" 和 "two" 的值。

需要注意的是,如果 Map 中不存在指定的鍵,則會返回該值型別的零值。因此,在獲取 Map 中的元素之前,需要先判斷該元素是否存在。

1.5 遍歷 Map

可以使用 for 迴圈來遍歷 Map 中的所有元素。在每次迴圈中,將會返回當前元素的鍵和值。例如:

// 遍歷map中的元素
for key, value := range m {
    fmt.Println(key, value)
}

上述程式碼將輸出Map中所有元素的鍵和值。

2. Map 高階用法

在 Go 語言中,Map 是一種非常重要的資料結構,它可以讓我們快速地儲存和檢索資料。除了基本操作之外,Map 還具有一些高階用法,本文將介紹這些高階用法。

2.1 Map 的零值

在 Go 語言中,如果我們宣告一個 Map 卻沒有給它賦值,那麼它的值將是 nil。但是,在使用 Map 前,我們應該將它初始化,以免出現意外錯誤。可以使用 make() 函式來初始化 Map。例如:

m := make(map[string]int)

這裡,我們建立了一個名為 m 的 Map,它的鍵是字串型別,值是整型。

2.2 Map 的長度

我們可以使用 len() 函式獲取 Map 的長度,即其中元素的數量。例如:

m := make(map[string]int)
m["foo"] = 42
m["bar"] = 13
fmt.Println(len(m))

這將輸出 2,因為 m 中有兩個元素。

2.3 Map 的刪除

我們可以使用 delete() 函式從 Map 中刪除元素。delete() 函式接受兩個引數:要刪除元素的 Map 和要刪除元素的鍵。例如:

m := make(map[string]int)
m["foo"] = 42
delete(m, "foo")

這將從 Map 中刪除名為 "foo" 的鍵。

2.4 Map 的併發安全性

在多個 Goroutine 中使用 Map 時,我們需要注意 Map 的併發安全性。多個 Goroutine 對同一個 Map 進行讀寫操作時,可能會導致競爭條件和資料競爭等問題。為了解決這些問題,Go 語言提供了 sync 包中的 Map 型別。sync.Map 型別可以安全地在多個 Goroutine 中使用。例如:

var m sync.Map
m.Store("foo", 42)
value, ok := m.Load("foo")

這裡,我們使用 sync.Map 型別建立了名為 m 的 Map,向其中新增了一個名為 "foo" 的鍵,值為 42。然後,我們使用 Load() 方法從 Map 中讀取 "foo" 鍵的值。

2.5 Map 的值為函式

在 Map 中,值可以是函式。這種用法非常實用,可以讓我們更加靈活地編寫程式碼。例如,我們可以使用 Map 來儲存不同的操作,然後根據需要呼叫這些操作:

var operations = map[string]func(int, int) int {
    "add": func(a, b int) int { return a + b },
    "sub": func(a, b int) int { return a - b },
    "mul": func(a, b int) int { return a * b },
}

result := operations["add"](3, 4)

這裡,我們建立了一個 Map,它的鍵是字串,值是函式型別。然後,我們可以使用這些函式來執行不同的操作,如計算加法、減法、乘法等。

3. 總結

在本文中,我們學習了 Map 的基礎知識和高階用法,包括 Map 定義的 零值、Map 的長度和 sync.Map。

歡迎點贊關注,感謝!

相關文章