1. 程式人生 > >go的Map

go的Map

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])
}
複製程式碼