go的Map
版權宣告:本文為博主原創文章,未經博主允許不得轉載。https://blog.csdn.net/u013255127/article/details/83782475
map是一種鍵值對資料結構,一個key鍵對應一個value值。map在其他有些程式語言中稱為字典。
map是引用型別,宣告方式為以下:
var map1 map[key]value var map1 map[string]int
map在宣告的時候不需要宣告長度,map是可以動態增長的。未初始化的map值為nil。key可以是任意使用 == 或者 != 操作符比較的型別,比如說string,int,float。所以陣列切片和結構體不能作為key,但是指標和介面型別可以。value可以是任意型別的。
例子:
var map1 map[string]int map1 = map[string]int{"one": 1, "two": 2} mapmake := make(map[string]int) mapmake["key1"] = 3 mapmake["key2"] = 4
不要使用new,永遠使用make來構造map
map也可以使用函式作為value:
mf := map[int]func() int{ 1: func() int {return 10} 2: func() int {return 20} }
跟陣列不一樣,map可以根據新增的key-value對動態的增減,因此map不存在固定長度或者最大顯示,但是你可以選擇標明map的初始容量cap,就像這樣make(map[key]value, cap)。
map1 := make(map[string]int, 100)
有的時候需要判斷map中是否存在key,這時就可以使用:
val1, isExist := map1[key1]
isExist返回的是一個bool值,如果key1存在,isExist為true,反之為false。如果只是單獨判斷,不使用key1的值,可以這樣:
_, isExist := map1[key1] or if _, isExist := map1[key1]; isExist { // do something }
刪除key1使用delete(map1, key1)即可,即使key1不存在,也不會報錯誤。
map使用for-range跟之前陣列切片一樣:
for key, value := range map1 { // do something }
如果只是想或者key,可以這樣使用:
for key := range map1 { fmt.Println(key) }
但是可以看出來,這裡key打印出來並不是安裝一定的順序列印的,而是無序的,可能列印10次,10次的順序都不一樣。
如果需要給map排序,就需要將key或者value拷貝到一個切片中,在對切片進行排序,使用sort包。然後切片for-range打印出所有的key和value。
barVal := map[string]int{"alpha": 34, "bravo": 56, "charlie": 23,"delta": 87, "echo": 56, "foxtrot": 12,"golf": 34, "hotel": 16, "indio": 87,"juliet": 65, "kili": 43, "lima": 98} for k, v := range barVal { fmt.Printf("Key: %v, Value: %v / ", k, v) } keys := make([]string, len(barVal)) i := 0 for k, _ := range barVal { keys[i] = k i++ } sort.Strings(keys) for _, k := range keys { fmt.Printf("Key: %v, Value: %v / ", k,barVal[k]) }