go的Map
程序员文章站
2022-03-04 18:57:28
...
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])
}