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

更新於 2023/08/28閱讀時間約 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
17會員
83內容數
golang
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Alan的開發者天地 的其他內容
👨‍💻簡介 在 Go 語言中,切片(Slice)是一種動態序列的資料結構,能夠方便地存儲和操作多個相同類型的元素。切片相比於陣列,更具有彈性,因為它的大小是可變的,可以根據需要動態增長或縮小。切片在處理集合型資料時非常實用,讓你能夠輕鬆地新增、刪除、修改和操作元素。
👨‍💻簡介 陣列就像是一個儲存相同類型資料的容器,你可以想像成裝滿了一樣東西的盒子,每個東西都叫做陣列元素。這種類型可以是基本的,像是整數或字串,也可以是你自己定義的型別。不過陣列有個限制,就是大小一旦確定就無法改變。在Go語言裡,陣列的長度也是型別的一部分。
👨‍💻簡介 本文簡單介紹了 Go 語言的流程控制概念,涵蓋了從條件語句到迴圈,再到 range 遍歷數據結構,以及 goto 與標籤 label 的應用。主要知識點為如何使用 if 語句進行條件判斷,以及在不同情況下運用 switch 語句。
👨‍💻簡介 本文快速介紹了 Go 語言中的各種運算符,從數學計算到邏輯判斷,包括自增自減、賦值、比較和位運算。透過實例和清晰的解釋,快速掌握如何在程式中運用這些運算符。
👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
👨‍💻簡介 在 Golang 中,你可以使用不同的方式來宣告變數和常數。宣告變數時,可以直接指定值,或者使用型別推導,更簡單地用 := 來宣告局部變數。另外,還可以一次宣告多個變數,相同型別的變數可以一起宣告,或者使用括號宣告不同型別的變數。常數則使用 const 關鍵字宣告,確保值不變
👨‍💻簡介 在 Go 語言中,切片(Slice)是一種動態序列的資料結構,能夠方便地存儲和操作多個相同類型的元素。切片相比於陣列,更具有彈性,因為它的大小是可變的,可以根據需要動態增長或縮小。切片在處理集合型資料時非常實用,讓你能夠輕鬆地新增、刪除、修改和操作元素。
👨‍💻簡介 陣列就像是一個儲存相同類型資料的容器,你可以想像成裝滿了一樣東西的盒子,每個東西都叫做陣列元素。這種類型可以是基本的,像是整數或字串,也可以是你自己定義的型別。不過陣列有個限制,就是大小一旦確定就無法改變。在Go語言裡,陣列的長度也是型別的一部分。
👨‍💻簡介 本文簡單介紹了 Go 語言的流程控制概念,涵蓋了從條件語句到迴圈,再到 range 遍歷數據結構,以及 goto 與標籤 label 的應用。主要知識點為如何使用 if 語句進行條件判斷,以及在不同情況下運用 switch 語句。
👨‍💻簡介 本文快速介紹了 Go 語言中的各種運算符,從數學計算到邏輯判斷,包括自增自減、賦值、比較和位運算。透過實例和清晰的解釋,快速掌握如何在程式中運用這些運算符。
👨‍💻簡介 Go 語言有各種資料型別,分為基本型別和複合型別。基本型別包括: 整數、浮點數、布林值、字串 複合型別包括: 陣列、片段、結構、函式、對映、通道、介面 等。 整數型別 整數型別有許多種,像是 int8、int16、int32、int64。我們可以依據實際需求選擇。
👨‍💻簡介 在 Golang 中,你可以使用不同的方式來宣告變數和常數。宣告變數時,可以直接指定值,或者使用型別推導,更簡單地用 := 來宣告局部變數。另外,還可以一次宣告多個變數,相同型別的變數可以一起宣告,或者使用括號宣告不同型別的變數。常數則使用 const 關鍵字宣告,確保值不變
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
倪海厦老师在天纪中提到了很多种断卦方法,这里只选取几个简单的方法进行概括,总结和简化,没有任何关于倪海厦老师知识的文章可以比得上倪海厦老师的原视频,建议各位看官从原视频中吸取更多好方法。
Thumbnail
上篇文章我們解說到了神經網路的基本架構包含了輸入層,輸出層,還有中間的隱藏層,也說明了這是一個把輸入資料拆解出特徵然後依照特徵做判斷的過程。究竟每一層的神經網路,如何影響下一層的神經網路可以辨識出特徵呢? 這些中間的線條(連結)到底是什麼意義呢? 這就是這一篇要告訴你的。
Thumbnail
在我的上一篇文章中,我們提到了人工智慧 & 機器學習 & 深度學習跟神經網路的關係,我們也了解到了所謂的深度學習是一種基於神經網路上的機器學習方法。那麼神經網路到底是什麼呢? 我們上一篇文章裡面提到的神經網路的層Layer究竟是什麼呢? 到底為什麼神經網路需要這麼多的神經元(Neurons)跟層數呢
昨晚睡觉前,我把手机放在枕头边,躺在床上,听Youtbue 上,一位叫做LT视界的大咖讲解沈栋发表的《红色赌盘》中的一些细节。 这位大咖的分析非常到位。我之前也听过很多沈栋在台湾的访谈节目。我当初对于这位作者的印象还不错,觉得他思路很敏捷,谈吐不凡,见识广,的确是很有感染力,吸引力和洞察力。是个了不
今日看到一句话让我感触颇深,想到了成长与经历这些字眼,觉得有道理便记下这段话; 离群索居者,不是野兽便是神灵。 尤其是在学生时代这种感觉尤为强烈,却不知都是一群连价值观都没形成的孩子。这种现象在学校中尤为突出。 被孤立的人啊!愿你成为上帝的宠儿。
Thumbnail
     中華民族是一個「詩的民族」,自上古時期就有詩歌流傳。中國古典詩歌從《詩經》開始,歷經楚辭、漢魏樂府詩、古詩十九首、南朝玄言詩、山水詩、田園詩、宮體詩,發展到唐朝,文治武功,極盛一時;不但詩人輩出,而且中國古典文學領域中的一切詩體都已齊備。所以,唐詩不但是唐朝文學的代表,也稱得上是中國古典詩
Thumbnail
上一篇發文前,我也把內容傳給綿羊老師看。聊著聊著,我說悔恨當天拍照很糊,老師馬上問我哪一張並傳了截圖給我。於是就有一張高清原圖和一張模糊變形的圖。為何不兩張都原圖?高清原圖是要證明老師拍照功力很強,模糊的圖是證明我很認真聽講啊!(笑) 閒話聊完,要進入今天的主題了。第四場講者是銳譯翻譯的翁雅如小姐。
Thumbnail
有許多網路的文章提起花月堂,都說這是一間 : 超大波羅麵包的專賣店。但是走進了淺草寺的西參道,與其說花月堂是賣菠蘿麵包,還不如說這是一間廟會概念的雜貨專門店。
Thumbnail
短篇小說,看似字數比較短,卻不代表內容品質與高度能偷工減料,也就是,你得呈現出和「長篇」小說同樣的效果,很驚人吧? 長篇小說的字數多,寫作彈性比較大,短篇小說當然就沒那麼有彈性,所以,不要相信那種「短篇小說適合初學者練習」這種鬼話,那是「請鬼拿藥單」。
Thumbnail
※本文係筆者於2014-2015年為學習司法官時,在高雄院檢學習檢方學習筆記整理簡要版,分發後擔任檢察官,一方面將過去在研究所學習的理論運用於檢警偵查作為合法性控制、另一方面將偵查技巧與偵查假設等運用於犯罪之發現,希望自己可以莫忘初衷——以程序正義來追求實體正義。
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
倪海厦老师在天纪中提到了很多种断卦方法,这里只选取几个简单的方法进行概括,总结和简化,没有任何关于倪海厦老师知识的文章可以比得上倪海厦老师的原视频,建议各位看官从原视频中吸取更多好方法。
Thumbnail
上篇文章我們解說到了神經網路的基本架構包含了輸入層,輸出層,還有中間的隱藏層,也說明了這是一個把輸入資料拆解出特徵然後依照特徵做判斷的過程。究竟每一層的神經網路,如何影響下一層的神經網路可以辨識出特徵呢? 這些中間的線條(連結)到底是什麼意義呢? 這就是這一篇要告訴你的。
Thumbnail
在我的上一篇文章中,我們提到了人工智慧 & 機器學習 & 深度學習跟神經網路的關係,我們也了解到了所謂的深度學習是一種基於神經網路上的機器學習方法。那麼神經網路到底是什麼呢? 我們上一篇文章裡面提到的神經網路的層Layer究竟是什麼呢? 到底為什麼神經網路需要這麼多的神經元(Neurons)跟層數呢
昨晚睡觉前,我把手机放在枕头边,躺在床上,听Youtbue 上,一位叫做LT视界的大咖讲解沈栋发表的《红色赌盘》中的一些细节。 这位大咖的分析非常到位。我之前也听过很多沈栋在台湾的访谈节目。我当初对于这位作者的印象还不错,觉得他思路很敏捷,谈吐不凡,见识广,的确是很有感染力,吸引力和洞察力。是个了不
今日看到一句话让我感触颇深,想到了成长与经历这些字眼,觉得有道理便记下这段话; 离群索居者,不是野兽便是神灵。 尤其是在学生时代这种感觉尤为强烈,却不知都是一群连价值观都没形成的孩子。这种现象在学校中尤为突出。 被孤立的人啊!愿你成为上帝的宠儿。
Thumbnail
     中華民族是一個「詩的民族」,自上古時期就有詩歌流傳。中國古典詩歌從《詩經》開始,歷經楚辭、漢魏樂府詩、古詩十九首、南朝玄言詩、山水詩、田園詩、宮體詩,發展到唐朝,文治武功,極盛一時;不但詩人輩出,而且中國古典文學領域中的一切詩體都已齊備。所以,唐詩不但是唐朝文學的代表,也稱得上是中國古典詩
Thumbnail
上一篇發文前,我也把內容傳給綿羊老師看。聊著聊著,我說悔恨當天拍照很糊,老師馬上問我哪一張並傳了截圖給我。於是就有一張高清原圖和一張模糊變形的圖。為何不兩張都原圖?高清原圖是要證明老師拍照功力很強,模糊的圖是證明我很認真聽講啊!(笑) 閒話聊完,要進入今天的主題了。第四場講者是銳譯翻譯的翁雅如小姐。
Thumbnail
有許多網路的文章提起花月堂,都說這是一間 : 超大波羅麵包的專賣店。但是走進了淺草寺的西參道,與其說花月堂是賣菠蘿麵包,還不如說這是一間廟會概念的雜貨專門店。
Thumbnail
短篇小說,看似字數比較短,卻不代表內容品質與高度能偷工減料,也就是,你得呈現出和「長篇」小說同樣的效果,很驚人吧? 長篇小說的字數多,寫作彈性比較大,短篇小說當然就沒那麼有彈性,所以,不要相信那種「短篇小說適合初學者練習」這種鬼話,那是「請鬼拿藥單」。
Thumbnail
※本文係筆者於2014-2015年為學習司法官時,在高雄院檢學習檢方學習筆記整理簡要版,分發後擔任檢察官,一方面將過去在研究所學習的理論運用於檢警偵查作為合法性控制、另一方面將偵查技巧與偵查假設等運用於犯罪之發現,希望自己可以莫忘初衷——以程序正義來追求實體正義。