Go | 初步了解「映射」型別
💬 簡介
映射(Map)是一個非常強大且常用的資料結構,能夠讓我們根據鍵值(key)快速查找對應的值(value)。它類似於其他語言中的字典或哈希表,適用於需要快速查找或組織資料的情境。
本文將介紹映射型別的基本概念、宣告、初始化及常見操作,並展示如何靈活運用映射來解決實際問題。
圖片來源:Gophers(地鼠造型的原創者為 Renee French)
✨ 映射的基本概念
映射(Map)是一種將「鍵」映射到「值」的資料結構。每一個映射都由鍵和值的對應關係組成,可以透過指定鍵來迅速取得對應的值。
1️⃣ 宣告與初始化映射
在 Go 中,映射可以使用 make
函式來初始化,並且指定其元素的型別。
- 範例:宣告和初始化映射
1
2
3
4var scores map[string]int
scores = make(map[string]int)
scores["Alice"] = 90
scores["Bob"] = 85📝 在這個範例中,我們創建了一個
map[string]int
類型的映射,用來存儲學生成績,並為Alice
和Bob
設定了分數。
2️⃣ 訪問映射元素
可以使用鍵來直接訪問映射中的值。如果鍵存在,會返回對應的值;如果鍵不存在,則返回映射型別的零值。
- 範例:訪問映射元素
1
2
3fmt.Println(scores["Alice"]) // 輸出: 90
fmt.Println(scores["Bob"]) // 輸出: 85
fmt.Println(scores["Carol"]) // 輸出: 0📝 在這個範例中,我們使用
scores["Alice"]
和scores["Bob"]
來訪問對應的分數,而scores["Carol"]
不存在則返回映射型別的零值。
🛠️ 範例:基本映射操作
1️⃣ 定義並初始化映射
- 範例:
1
2
3
4
5
6
7
8
9
10
11
12package main
import "fmt"
func main() {
// 使用 make 函式初始化映射
studentGrades := make(map[string]int)
studentGrades["John"] = 80
studentGrades["Jane"] = 95
fmt.Println(studentGrades) // 輸出: map[John:80 Jane:95]
}📝 在這個範例中,我們使用
make
函式創建並初始化了studentGrades
映射,並加入了兩個學生成績。
2️⃣ 刪除映射中的元素
如果需要從映射中刪除某個鍵值對,可以使用 delete 函式。
- 範例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14package main
import "fmt"
func main() {
scores := map[string]int{
"Alice": 90,
"Bob": 85,
}
// 刪除 "Bob" 的成績
delete(scores, "Bob")
fmt.Println(scores) // 輸出: map[Alice:90]
}📝 在這個範例中,我們使用
delete
函式將"Bob"
的成績從映射中刪除。
3️⃣ 判斷鍵是否存在
訪問映射時,可以使用 value, ok
的方式來檢查鍵是否存在。
- 範例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package main
import "fmt"
func main() {
scores := map[string]int{
"Alice": 90,
}
value, ok := scores["Bob"]
if ok {
fmt.Println(value)
} else {
fmt.Println("Bob not found")
}
}📝 在這個範例中,我們檢查
"Bob"
是否存在於映射中,並根據檢查結果做出相應的處理。
💡 進階使用
↔️ 遍歷映射中的元素
可以使用 for
迴圈來遍歷映射中的所有鍵值對,利用 range
關鍵字來簡化操作。
- 範例:遍歷映射
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15package main
import "fmt"
func main() {
studentScores := map[string]int{
"Alice": 90,
"Bob": 85,
"Charlie": 88,
}
for name, score := range studentScores {
fmt.Printf("%s: %d\n", name, score)
}
}📝 在這個範例中,我們使用
range
來遍歷studentScores
映射,並輸出每個學生的姓名和分數。
🚀 映射的優化與限制
⚠️ 限制
- 記憶體佔用:映射的記憶體使用是根據存儲的元素來動態分配的,當有大量元素時會佔用相對較大的記憶體。
- 無序性:映射中的元素是無序的,因此無法保證遍歷時的順序。
🚀 優化
- 選擇適當的鍵類型:映射的鍵應該是可以比較的類型,常見的有字串、數字等,避免使用無法比較的複雜類型。
- 初始化映射容量:如果已知映射的元素數量,最好在初始化時預設容量來提高效能。
🎯總結
映射(Map)是一個非常強大的資料結構,能夠幫助我們根據鍵來高效地查找、更新和刪除對應的值。理解其基本操作和進階使用技巧將使你的程式更加靈活高效。
最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。
註:以上參考了
Go
Go-Map types