# map
### **map 的基本介紹**
map 是 key-value 數據結構,又稱為字段或者關聯數組。類似其它編程語言的集合, 在編程中是經常使用到
### **map 的聲明**
var map 變量名 map\[keytype\]valuetype
golang 中的 map,的 key 可以是很多種類型,比如 bool, 數字,string, 指針, channel , 還可以是只 包含前面幾個類型的 接口, 結構體, 數組
### **基本語法**
var map 變量名 map\[keytype\]valuetype
**key 可以是什么類型**
golang 中的 map,的 key 可以是很多種類型,比如 bool, 數字,string, 指針, channel , 還可以是只 包含前面幾個類型的 接口, 結構體, 數組
通常 key 為 int 、string
注意: slice, map 還有 function 不可以,因為這幾個沒法用 \== 來判斷
**valuetype 可以是什么類型**
valuetype 的類型和 key 基本一樣,這里我就不再贅述了 通常為: 數字(整數,浮點數),string,map,struct
### **map 聲明的舉例**
var a map\[string\]string
var a map\[string\]int
var a map\[int\]string
var a map\[string\]map\[string\]string
**注意:聲明是不會分配內存的,初始化需要 make ,分配內存后才能賦值和使用。**

對上面代碼的說明
1) map 在使用前一定要 make
2) map 的 key 是不能重復,如果重復了,則以最后這個 key-value 為準
3) map 的 value 是可以相同的.
4) map 的 key-value 是無序
5) make 內置函數數目

**map 的使用**




**map 的增刪改查操作**
map 增加和更新:
map\["key"\] = value //如果 key 還沒有,就是增加,如果 key 存在就是修改。
map 刪除:
delete(map,"key") ,delete 是一個內置函數,如果 key 存在,就刪除該 key-value,如果 key 不存在,不操作,但是也不會報錯


細節說明
如果我們要刪除 map 的所有 key ,沒有一個專門的方法一次刪除,可以遍歷一下 key, 逐個刪除 或者 map = make(...),make 一個新的,讓原來的成為垃圾,被 gc 回收

**map 查找:**

對上面代碼的說明:
說明:如果 heroes 這個 map 中存在 "no1" , 那么 findRes 就會返回 true,否則返回 false
**map 遍歷:**


**map 的長度:**

map 切片
切片的數據類型如果是 map,則我們稱為 slice of map,map 切片,這樣使用則 map 個數就可以動態變化了。

**map 排序**
1) golang 中沒有一個專門的方法針對 map 的 key 進行排序
2) golang 中的 map 默認是無序的,注意也不是按照添加的順序存放的,你每次遍歷,得到的輸出可能不一樣
3) golang 中 map 的排序,是先將 key 進行排序,然后根據 key 值遍歷輸出即可


**map 使用細節**
1) map 是引用類型,遵守引用類型傳遞的機制,在一個函數接收 map,修改后,會直接修改原來 的 map 【案例演示】

2) map 的容量達到后,再想 map 增加元素,會自動擴容,并不會發生 panic,也就是說 map 能動 態的增長 鍵值對(key-value)
3) map 的 value 也經常使用 struct 類型,更適合管理復雜的數據(比前面 value 是一個 map 更好),比如 value 為 Student 結構體 【案例演示,因為還沒有學結構體,體驗一下即可】
