Go語言中 map 是一種特殊的數據結構,一種元素對(pair)的無序集合,pair 對應一個 key(索引)和一個 value(值),所以這個結構也稱為關聯數組或字典,這是一種能夠快速尋找值的理想結構,給定 key,就可以迅速找到對應的 value。
map 是引用類型,可以使用如下方式聲明:
```
var mapname map[keyType]valueType
```
- mapname 為 map 變量名
- keyType 為鍵類型
- valueType 為鍵對應的值類型
在聲明的時候不需要知道 map 的長度,因為 map 是可以動態增長的,未初始化的 map 的值是 nil,使用函數 len() 可以獲取 map 中 pair 的數目。
映射的鍵可以是任何值。這個值的類型可以是內置的類型,也可以是結構類型,只要這個值可以使用==、!= 運算符做比較。切片、函數以及包含切片的結構類型這些類型由于具有引用語義,不能作為映射的鍵,使用這些類型會造成編譯錯誤
```
package main
import "fmt"
func main() {
var map1 map[string]int
map1 = map[string]int{"one": 1, "two": 2}
var map2 = make(map[string]int)
map2 = map1
// map也是一種引用類型,如果兩個map同時指向一個底層,那么一個改變,另一個也相應改變。
map2["two"] = 3
fmt.Printf("Map1 is: %v\n", map1) // Map1 is: map[one:1 two:3]
fmt.Printf("Map2 is: %v\n", map2) // Map2 is: map[one:1 two:3]
}
```
注意:可以使用 make(),但不能使用 new() 來構造 map,如果錯誤的使用 new() 分配了一個引用對象,會獲得一個空引用的指針,相當于聲明了一個未初始化的變量并且取了它的地址:
```
map2 := new(map[string]int)
```
接下來當我們調用 `map2["two"] = 3` 的時候,編譯器會報錯:
```
invalid operation: map2["two"] (type *map[string]int does not support indexing)
```
## map遍歷
```
package main
import "fmt"
func main() {
var map1 map[string]int
map1 = map[string]int{"one": 1, "two": 2, "three": 3}
for key, val := range map1{
fmt.Printf("key is: %v --- val is: %v\n", key, val)
}
}
```
只遍歷值可以使用`_`改為匿名變量的形式:
```
for _, val := range map{
```
只遍歷鍵可以直接忽略值:
```
for key := range map{
```
map 是無序(存入的值和取出的值順序不一定一致)的如果需要特定順序的遍歷結果,正確的做法是先排序
```
package main
import (
"fmt"
"sort"
)
func main() {
var map1 map[string]int
map1 = map[string]int{"one": 1, "two": 2, "three": 3}
map1["a"] = 0
map1["p"] = 4
var slice1 []string
for key := range map1{
slice1 = append(slice1, key)
}
sort.Strings(slice1)
fmt.Println(slice1) // [a one p three two]
}
```
## 刪除元素
使用 delete() 內建函數從 map 中刪除一組鍵值對,delete() 函數的格式如下:
```
delete(map, key)
```
```
package main
import (
"fmt"
)
func main() {
var map1 map[string]int
map1 = map[string]int{"one": 1, "two": 2, "three": 3}
delete(map1, "two")
fmt.Printf("%v", map1) // map[one:1 three:3]
}
```
**判斷鍵是否存在**
```
package main
import (
"fmt"
)
func main() {
var map1 map[string]int
map1 = map[string]int{"one": 1, "two": 2, "three": 3}
value, exist := map1["one"]
// 鍵存在 exist 為true, 否則為 false
fmt.Println(exist) // true
if exist{
fmt.Printf("%v", value)
}
}
```