go的Map
阿新 • • 發佈:2018-11-06
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])
}
複製程式碼