Go中的Map
概念
- map是一種資料結構, 一個集合, 儲存一系列無序的鍵值對
- map基於鍵儲存的, 鍵值相當於索引
- map可以通過鍵快速索引資料, 鍵指向該鍵關聯的值
內部實現
- map是給予hash(雜湊表)來實現的, 每次列印的key和value都是無序的, 每次迭代都不一樣
- map的雜湊表包含一組桶, 每次儲存和查詢鍵值對的時候, 都要先選擇一個桶, 就是把指定的鍵傳給雜湊函式, 就可以索引到相應的桶, 進而找到對應的鍵值
- map儲存的是無序的鍵值對集合, 儲存的資料越多, 索引分佈越均勻, 反問鍵值對的速度就越快
宣告和初始化
- 使用
make
進行建立mapdict := make(map[string]int) dict["aaa"] = 123 複製程式碼
- 使用
:=
進行建立和初始化mapdict := map[string]int{"aaa": 123, "bbb": 456} 複製程式碼
- 使用
:=
建立一個空的mapdict := map[string]int{} 複製程式碼
- 使用
make
建立一個值為nil的mapvar dict map[string]int // 建立為nil的map後不能直接操作, 必須先初始化 dict = make(map[string]int) dict['aaa'] = 123 複製程式碼
map的特性
- map的鍵可以是任何值, 鍵的型別可以是任何型別(也可以是結構型別)
- 鍵值可以使用
==
進行比較, 所以像切片, 函式和含有切片的結構型別就不能使用map進行構建, 他們具有引用的語義無法進行比較 - 切片等不能再鍵中使用, 可以在值中使用
使用map
-
通過鍵設定和獲得map中的值
dict := make(map[string]int) dict['aaa'] = 123 count := dict['aaa'] 複製程式碼
-
判斷值是否存在
count, age := dict['aaa'] if (age != nil) { ... } 複製程式碼
-
使用
delete
刪除map中的鍵值對delete(dict, 'aaa') 複製程式碼
-
使用
for range
遍歷mapfunc main() { dict := map[string]int{"王五": 60, "張三": 43} var names []string for name := range dict { names = append(names, name) } sort.Strings(names) //排序 for _, key := range names { fmt.Println(key, dict[key]) } } 複製程式碼
函式間傳遞map
函式中的map傳遞不會複製, 函式中修改鍵值對會對原來的map產生影響, 屬於引用傳遞
func main() {
dict := map[string]int{"王五": 60, "張三": 43}
modify(dict)
fmt.Println(dict["張三"])
}
func modify(dict map[string]int) {
dict["張三"] = 10
}
複製程式碼