#### Go map
***若是生命是一道牆,那麼聲聲必有迴響***
上一節咱們學習了數組與切片,學習的仍是基礎部分, 高級部分有二維數組,多維數組...;
在這裏先不寫高級部分,高級部分與初級部分並無太大區別,一個是多維切片,在每一維使用前都須要make,第二個是遍歷時須要多層循環;
##### map
在 Go 中map 是key:value 數據結構,相似python 中的字典;
基本語法:
var 變量名 map[keyType]valueType
其中key 能夠是以下類型:
bool, 數字,string, 指針, channel,一樣還能夠是包含前幾個類型的接口,結構體,數組;
不過通常開發使用中key 一般爲int,string;
key 須要知足可使用== 判斷,因此slice,map,函數這三個類型不能夠做爲map 的key ;
value 的數據類型同key 同樣, 一般爲數字,string, map,struct;
案例:
var a map[string]string var b map[int]string var c map[string]map[int]string var d map[string]int
map 是引用類型和slice 一樣,聲明或定義是不會分配內存,初始化都須要make 才能使用;
package main import "fmt" func main(){ var a map[string]string a = make(map[string]string) a["01"] = "01" a["02"] = "02" a["03"] = "03" a["01"] = "04" fmt.Println(a) }
1. map 在使用前須要make ;
2. map 的key 不能重複,若是重複則key 的值爲最後一次賦的值 ;
3. map 是無序的,因此若是須要對map 排序,則須要對key 進行排序 ;
---
##### map 的聲明和初始化方式
package main import "fmt" func main(){ // 1. 先聲明,再make ,最後使用 var a map[string]string a = make(map[string]string) a["01"] = "01" fmt.Println(a) // 2. 直接使用類型推導 b := make(map[string]string) b["01"] = "01" fmt.Println(b) // 3. 字面量方式 var c = map[string]string{ "01":"01", } fmt.Println(c) }
##### map 的增刪改查
map 的增長和更改
map[key] = value // 若是map 內不存在key 則屬於添加操做,不然屬於更改操做;
package main import "fmt" func main(){ // 1. 先聲明,再make ,最後使用 var a map[string]string a = make(map[string]string) // 增長操做 a["01"] = "01" a["02"] = "02" // 更改操做 a["01"] = "10" fmt.Println(a) // map[01:10 02:02] }
map 刪除
delete(map,key) ,delete 是內置函數,若是key 存在則會刪除這對key:value,若是key 不存在,則不會操做,也不會報錯;
package main import "fmt" func main(){ // 1. 先聲明,再make ,最後使用 var a map[string]string a = make(map[string]string) // 增長操做 a["01"] = "01" a["02"] = "02" // 更改操做 a["01"] = "10" fmt.Println(a) // map[01:10 02:02] // 刪除已經存在的key delete(a,"02") // 刪除不存在的key delete(a,"10") }
---
注意: 在Go 中沒有專門的函數能夠一次性刪除map 中因此的key, 也就是說沒有辦法一次性清空map,
若是須要刪除全部的key, 則須要遍歷map , 一個一個刪除; 另外一個辦法則是讓gc 回收: map = make(map[keyType][valueType]);
map 查找
val,res = map[key]
若是map 中存在key 則返回value,同時返回res=true,不然不會返回value,res=false;
package main import "fmt" func main(){ // 1. 先聲明,再make ,最後使用 var a map[string]string a = make(map[string]string) // 增長操做 a["01"] = "01" a["02"] = "02" var value string var res bool value,res = a["01"] if res { // 若是有這個key fmt.Println("key:01 value:",value) } else { // 若是沒有這個key fmt.Println("no value",value) } value,res = a["10"] if res { // 若是有這個key fmt.Println("key:10 value:",value) } else { // 若是沒有這個key fmt.Println("no value",value) } }
##### map 的遍歷
map 的遍歷方式可使用for-range 方式
package main import "fmt" func main() { // 1. 普通的map var a map[string]string a = make(map[string]string) // 增長操做 a["01"] = "01" a["02"] = "02" for key,value := range a { fmt.Println(key+"=",value) } // map 的value 仍是一個map var b map[string]map[string]string b = make(map[string]map[string]string) b["01"] = map[string]string{"001":"0001"} // 第二層這裏使用的是字面量方式 // 也可使用這樣的方式 c := make(map[string]string) c["002"] = "0002" b["02"] = c fmt.Println(b) // 複雜map 的遍歷 for key,value := range b { for key2,value2 := range value { fmt.Printf("first key=%s,first value=%v | second key=%s,second value=%s\n",key,value,key2,value2) } } }
##### map 的長度使用len 函數
##### map 類型的切片
若是切片的數據類型是map , 那麼map 的個數就能夠動態變化了,這個在json 中比較經常使用,json 序列化和反序列化後面會學習到;
package main import "fmt" func main() { // 聲明切片的類型爲map var arr []map[string]string // 聲明一個map 類型 var a map[string]string // 初始化map a = make(map[string]string) // map 賦值 a["01"] = "01" // 初始化切片 arr = make([]map[string]string,0) // append 函數底層會檢查是否make ,因此這一行能夠省略; arr = append(arr,a) // 再添加一個map var b map[string]string b = make(map[string]string) b["001"] = "001" arr = append(arr,b) fmt.Println(arr) }
##### map 排序
在上面咱們知道了,map 自己是無序的,因此排序須要先對key 排序,而後按排序後的key 輸出map便可;
package main import ( "fmt" "sort" ) func main() { var a map[string]string a = make(map[string]string) a["01"] = "01" a["first"] = "first" a["second"] = "second" a["third"] = "third" a["fourth"] = "fourth" // 輸出是無序的,多運行幾回便可看到 for k,v := range a { fmt.Println(k,v) } // 對map 排序,須要先對key 排序 var keySlice []string for key,_ := range a { keySlice = append(keySlice,key) } // 排序 // 排序前 fmt.Println(keySlice) sort.Strings(keySlice) // 排序後 fmt.Println(keySlice) // 按排序後的key 輸出map for _,key := range keySlice { fmt.Println(key,a[key]) } }
map 的使用注意事項
1. map 是引用類型,遵照引用類型傳遞機制,在函數內部修改後,會改變原來的值 ;
2. map 會自動擴容,能夠動態增加;
package main import "fmt" func test01(a map[string]string){ // 新增長一個key:value a["02"] = "02" } func main() { var a map[string]string a = make(map[string]string) a["01"] = "01" a["first"] = "first" // 傳入函數前 fmt.Println(a) //map[01:01 first:first] // 傳入函數後 // 能夠看出map 是引用類型,遵照引用傳遞機制 test01(a) fmt.Println(a) //map[01:01 first:first 02:02] }
最新文章會在微信公衆號,歡迎關注學習交流python