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])
}
复制代码

猜你喜欢

转载自juejin.im/post/5be0fc75e51d4505551f98a6