淺談 Go 語言中的 Map — 快速查詢與狀態儲存的利器

更新於 發佈於 閱讀時間約 8 分鐘


raw-image

👨‍💻簡介

在 Go 語言中,有著一個強大又便捷的工具,可以讓你以鍵-值(Key-Value)的形式儲存和查詢資料,它就是「Map」。Map 在 Go 語言中扮演了重要的角色,簡化了許多資料處理的任務,現在讓我們一起來深入了解這個有趣的資料型別。

Map的基本概念

Map 是 Go 語言中的一種內建資料型別,用來存儲鍵值對。簡單來說,你可以將 Map 想像成一個無序的集合,每個元素都有一個唯一的鍵和相應的值。這讓你可以根據鍵來快速查詢和存取對應的值,就像是字典一樣。

宣告和初始化 Map

在 Go 中,宣告 Map 可使用以下語法:

m1 := make(map[string]int) // 創建一個儲存字串為鍵,整數為值的 Map
m2 := map[int]string{1: "A", 2: "B"} // 創建一個包含鍵值對的映射
var m3 map[string]int // 創建一個鍵為字串、值為整數的空映射

而宣告時順便初始化可以使用以下方式:

myMap := map[string]int{
"apple": 3,
"banana": 5,
}

var myMap map[string]int
myMap = map[string]int{
"apple": 3,
"banana": 5,
}

Map的基本操作

Map 的操作非常簡單直觀。你可以使用鍵來存取對應的值,也可以使用鍵來新增、修改或刪除元素。

新增或修改元素

myMap["apple"] = 3    // 新增一個元素,鍵是 "apple",值是 3
myMap["banana"] = 5 // 新增一個元素,鍵是 "banana",值是 5
myMap["apple"] = 10 // 修改鍵為 "apple" 的元素的值為 10

查詢元素

value := myMap["banana"]   // 根據鍵 "banana" 查詢對應的值

刪除元素

delete(myMap, "apple")   // 刪除鍵為 "apple" 的元素

遍歷 Map

要遍歷一個 Map 中的所有元素,通常會使用 for range 迴圈:

for key, value := range myMap {
fmt.Println("Key:", key, "Value:", value)
}

Map 的特性、限制與使用場景

Map 的特性與限制

雖然 Map 是極其方便的資料結構,但也有一些需要注意的地方:

  1. 無序性: Map 中的元素是無序的,不像陣列或切片那樣有明確的順序。
  2. 鍵的唯一性: 每個鍵在 Map 中只能出現一次,這確保了每個鍵都對應唯一的值。
  3. 零值返回: 若查詢不存在的鍵,會返回值型別的零值,例如整數型別返回 0,字串型別返回空字串。
  4. 內存消耗: Map 是引用型別,存儲的是指向實際數據的指針,這可能導致內存消耗增加。
  5. 並發安全: Map 在多執行緒環境下需要特殊處理,可以使用 sync 包中的相關函式進行安全操作。

Map 的使用場景

Map 在很多場景中都非常有用,例如:

  1. 字典: 想像一下你有一本字典,你查找一個單詞時,你會找到它的解釋。在程式裡,你可以用 Map 來建立這種關聯,每個單詞對應到它的解釋。
  2. 計數器: 如果你想知道一段文字中每個單詞出現的次數,你可以使用 Map。你從文字中抓取每個單詞,然後在 Map 中記錄它出現的次數。
  3. 快速查詢: 想像你有一張表格,裡面寫著每個用戶的姓名和他們的聯繫方式。你想通過姓名來找到聯繫方式,這就像在程式中使用 Map,透過用戶名找到相對應的資訊。
  4. 紀錄狀態: 舉個例子,你在一個遊戲中,想要記錄每個玩家的生命值。你可以使用 Map 來將每個玩家的名字對應到他們的生命值。
  5. 暫存資料: 想像你做了一個複雜的計算,但你不想每次都重新計算。你可以使用 Map 把計算結果儲存在裡面,以後需要時直接取出。
  6. 設定管理: 如果你的程式需要一些設定,像是遊戲的難度或網站的外觀,你可以使用 Map 儲存這些設定,方便管理和調整。
  7. 關聯數據: 想像你有一個應用程式,需要儲存每位用戶的個人資料。使用 Map 可以將每個用戶的ID對應到他們的資料,就像是在虛擬的表格中。
  8. 事件管理: 如果你有很多不同的事件,每個事件都需要不同的處理方式,你可以使用 Map 把事件類型與對應的處理方法關聯起來。
  9. 角色權限: 在一個應用程式中,不同的用戶可能有不同的權限。你可以使用 Map 把每個用戶的角色對應到他們的權限,以便進行訪問控制。

常見用法

  1. 字典建立: 創建一個字典,將單字對應到它們的解釋。
package main

import "fmt"
func main() {
dictionary := map[string]string{
"apple": "a fruit",
"banana": "a yellow fruit",
"cherry": "a red fruit",
}
fmt.Println(dictionary["apple"])
fmt.Println(dictionary["banana"])
fmt.Println(dictionary["cherry"])
}

2. 計數器: 統計文字中每個單字的出現次數。

package main

import (
"fmt"
"strings"
)
func main() {
text := "apple banana apple cherry banana apple"
words := strings.Fields(text)
wordCount := make(map[string]int)
for _, word := range words {
wordCount[word]++
}
fmt.Println(wordCount)
}

3. 快速查詢: 儲存用戶名對應的用戶資訊。

package main

import "fmt"
func main() {
userMap := map[string]string{
"alice": "Alice Johnson",
"bob": "Bob Smith",
"charlie": "Charlie Brown",
}
fmt.Println(userMap["alice"])
fmt.Println(userMap["bob"])
}

4. 狀態存儲: 儲存玩家名字和對應的生命值。

package main

import "fmt"
func main() {
playerStatus := map[string]int{
"alice": 100,
"bob": 75,
"charlie": 90,
}
fmt.Println(playerStatus["alice"])
fmt.Println(playerStatus["bob"])
}

小結

Map 是一種讓你能夠以鍵-值對的方式來組織和存儲資料的方式,它在 Go 語言中扮演著重要的角色。記住 Map 的基本概念、操作方法和限制,這將有助於你在寫程式時選擇適合的資料結構。

📚Reference

留言
avatar-img
留言分享你的想法!
avatar-img
Alan的開發者天地
18會員
83內容數
golang
Alan的開發者天地的其他內容
2023/10/04
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
2023/10/04
👨‍💻 簡介 最近想要透過小實作來撰寫筆記,達到做中學的效果,因此就來實作個小爬蟲順便結合前面學到的package做一個小複習。
Thumbnail
2023/09/28
👨‍💻簡介 今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式: Prompt:跳出單行使用者輸入。 Select:提供一個選項列表供使用者選擇。
Thumbnail
2023/09/28
👨‍💻簡介 今天來介紹一個自己開發後端蠻常用的一個 package,promptui,拿來做menu真的很方便,promptui有兩個主要的輸入模式: Prompt:跳出單行使用者輸入。 Select:提供一個選項列表供使用者選擇。
Thumbnail
2023/09/26
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
2023/09/26
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
看更多
你可能也想看
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
「欸!這是在哪裡買的?求連結 🥺」 誰叫你太有品味,一發就讓大家跟著剁手手? 讓你回購再回購的生活好物,是時候該介紹出場了吧! 「開箱你的美好生活」現正召喚各路好物的開箱使者 🤩
Thumbnail
Dictionary(字典) : 是一個可以用來存放不同資料(不同型態)的容器(集合) 每一個元素都是以{鍵(Key):值(Value)}所構成,字典中每個項目都是用","隔開
Thumbnail
Dictionary(字典) : 是一個可以用來存放不同資料(不同型態)的容器(集合) 每一個元素都是以{鍵(Key):值(Value)}所構成,字典中每個項目都是用","隔開
Thumbnail
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
👨‍💻 簡介 一開始介紹基本資料型別時有稍微提到一點string的處理,今天介紹string的一些操作,像是檢查的功能、修改的功能、比較的功能等等。
Thumbnail
👨‍💻 簡介 一開始介紹基本資料型別時有稍微提到一點string的處理,今天介紹string的一些操作,像是檢查的功能、修改的功能、比較的功能等等。
Thumbnail
👨‍💻 簡介 今天的encoding/json package是我日常在開發web時很常用到的package之一,主要是用來將Go struct和 JSON 之間進行轉換。主要功能為資料序列化(marshalling)和反序列化(unmarshalling)。
Thumbnail
👨‍💻 簡介 今天的encoding/json package是我日常在開發web時很常用到的package之一,主要是用來將Go struct和 JSON 之間進行轉換。主要功能為資料序列化(marshalling)和反序列化(unmarshalling)。
Thumbnail
👨‍💻簡介 當我們在宣告變數時,電腦會為該變數在記憶體中分配一個位置,然後將這個變數值儲存在這個位置上,需要讀取或修改這個變數值時,電腦是透過記憶體位置來存取這個值。 今天來簡單介紹一下go的Pointer,他的特性以及常見用法。
Thumbnail
👨‍💻簡介 當我們在宣告變數時,電腦會為該變數在記憶體中分配一個位置,然後將這個變數值儲存在這個位置上,需要讀取或修改這個變數值時,電腦是透過記憶體位置來存取這個值。 今天來簡單介紹一下go的Pointer,他的特性以及常見用法。
Thumbnail
👨‍💻簡介 在程式開發的世界中,我們經常需要處理各式各樣的資料,可能是一個人的個人資訊,也可能是一個商品的詳細訊息。當我們面對這麼多的資料時,如何將它們有系統地整理起來,讓我們能夠輕鬆地找到所需,便成了一個重要的課題。這時,結構體的概念就像是一道曙光,為我們提供了一個非常有力的工具。 結
Thumbnail
👨‍💻簡介 在程式開發的世界中,我們經常需要處理各式各樣的資料,可能是一個人的個人資訊,也可能是一個商品的詳細訊息。當我們面對這麼多的資料時,如何將它們有系統地整理起來,讓我們能夠輕鬆地找到所需,便成了一個重要的課題。這時,結構體的概念就像是一道曙光,為我們提供了一個非常有力的工具。 結
Thumbnail
👨‍💻簡介 在 Go 語言中,函數(Function)是一個強大且重要的概念,就像食譜一樣,告訴你應該如何處理食材,最後得到一道美味的料理。經過哪些程序讓程式更有組織性和可讀性。函數可幫助你將程式碼區塊組織成可重複使用的元件,進而執行特定的任務。
Thumbnail
👨‍💻簡介 在 Go 語言中,函數(Function)是一個強大且重要的概念,就像食譜一樣,告訴你應該如何處理食材,最後得到一道美味的料理。經過哪些程序讓程式更有組織性和可讀性。函數可幫助你將程式碼區塊組織成可重複使用的元件,進而執行特定的任務。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News