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)
}
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")
}
}
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)
}
}
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 mainimport "fmt"func main() {var m map[string]int // 未初始化,值為 nil// 嘗試存取 nil map 會引發 panic// m["Alice"] = 25 // 編譯時不會報錯,但運行時會崩潰// 正確做法:用 make 初始化m = make(map[string]int)m["Alice"] = 25fmt.Println("Initialized map:", m)}
map 的高級操作
1.
嵌套 map
package main
import "fmt"
func main() {m := make(map[string]map[string]int)// 初始化嵌套 mapm["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 或函數作為鍵。
留言
張貼留言