golang 的 map 介紹

在 Golang 中,map 是用於存儲鍵值對(key-value pair)的一種資料結構,類似於其他語言中的字典(dictionary)或哈希表(hash table)。


map 的特性

1.鍵值對存儲: map 是一個無序的集合,每個元素都由鍵(key)和值(value)組成。

2.鍵的要求:

3.鍵必須是可比較的(例如:字串、整數)。

4.不支持 slice、map 或 function 作為鍵,因為它們是不可比較的型態。

5.值的類型: 值可以是任意合法的 Golang 型態。

6.無序性: map 中的元素存儲是無序的,無法保證遍歷順序。



map 的基本操作

1.

創建和初始化 map

package main

import "fmt"
func main() {
// 使用 make 初始化 map
m := make(map[string]int)
m["Alice"] = 25
m["Bob"] = 30
// 使用字面量初始化 map
m2 := map[string]int{
"Alice": 25,
"Bob":   30,
}
fmt.Println("Map m:", m)
fmt.Println("Map m2:", m2)
}


2.

存取值

package main

import "fmt"
func main() {
m := map[string]int{"Alice": 25, "Bob": 30}
// 存取值
fmt.Println("Alice's age:", m["Alice"])
// 檢查鍵是否存在
age, exists := m["Charlie"]
if exists {
fmt.Println("Charlie's age:", age)
} else {
fmt.Println("Charlie not found in map")
}
}


3.

刪除元素

package main

import "fmt"
func main() {
m := map[string]int{"Alice": 25, "Bob": 30}
fmt.Println("Before deletion:", m)
// 刪除鍵 "Alice"
delete(m, "Alice")
fmt.Println("After deletion:", m)
}


4.

遍歷 map

import "fmt"

func main() {
m := map[string]int{"Alice": 25, "Bob": 30}
// 遍歷 map
for key, value := range m {
fmt.Printf("Key: %s, Value: %d\n", key, value)
}
}


5.

map 的零值

package main
import "fmt"
func main() {
var m map[string]int // 未初始化,值為 nil
// 嘗試存取 nil map 會引發 panic
// m["Alice"] = 25 // 編譯時不會報錯,但運行時會崩潰
// 正確做法:用 make 初始化
m = make(map[string]int)
m["Alice"] = 25
fmt.Println("Initialized map:", m)
}



map 的高級操作

1.

嵌套 map

package main 
import "fmt" 
func main() {
m := make(map[string]map[string]int)
// 初始化嵌套 map
m["team1"] = map[string]int{"Alice": 25, "Bob": 30}
m["team2"] = map[string]int{"Charlie": 35, "David": 40}
fmt.Println("Nested map:", m)
}



2.

map 作為函數參數

package main


import "fmt"

func modifyMap(m map[string]int) {
m["Alice"] = 100
}
func main() {
m := map[string]int{"Alice": 25, "Bob": 30}
fmt.Println("Before modification:", m)
modifyMap(m)
fmt.Println("After modification:", m)
}



3.

設置初始容量


package main
import "fmt"
func main() {
m := make(map[string]int, 10) // 初始化容量為 10
m["Alice"] = 25
m["Bob"] = 30
fmt.Println("Map with initial capacity:", m)
}




常見錯誤與注意事項

未初始化的 map:

對零值的 map 操作會導致運行時崩潰。

解決方法是使用 make 或字面量初始化。

遍歷順序無序:

map 的遍歷順序是不固定的。如果需要固定順序,可以提取鍵,進行排序後處理。


map 的鍵類型:

必須是可比較的(如整數、字串、布林值等)。

無法使用切片、map 或函數作為鍵。


留言

這個網誌中的熱門文章

[Kotlin]如何學習Kotlin

[golang]如何使用 gorm 高效執行批量插入 (可以透過 Create()、CreateInBatches(),或者 原生 SQL 語句 來提升效率)

[Kotlin]Kotlin Multiplatform (KMP) 如何安裝使用和部署