Go Map

#### 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

相關文章
相關標籤/搜索