Map

map结果通常是现代语言中高频使用的结构。了解map的使用方法和map的底层解构是十分必要的,本小节将介绍map的使用, map的底层原来健在go runtime的章节介绍。

Map 变量声明

var m map[keytype]valuetype

map的key是有要求的,key必须是可比较类型,比如常见的 stringint类型。而数组,切片,和结构体不能作为key类型。

map的value可以是任何类型。

map的默认初始值为 nil

创建map和添加元素

golang中创建map需要使用make方法

格式如下

m := make(map[keytype]valuetype, cap)

cap参数可以省略。map的容量是根据实际需要自动伸缩。

内置函数len可以获取map的长度

map make之后就可以添加元素了

m:=make(map[string]int)
m["aa"]=1
m["bb"]=2

判断key是否存在

m:=make(map[string]int)
m["aa"]=1
m["bb"]=2

v, found := m["aa"] //found为true 为1
v, found := m["aaa"] //found为false 为0

//通常和if表达是一起,判断key是否存在
if vv,found:=m["bb"];found { //key存在
    //code
}

删除map中的元素

map使用内置函数delete来删除元素。

delete(m,key)
m:=make(map[string]int)
m["aa"]=1

delete(m,"aa") 
delete(m,"bb") // key不存在也不会报错 

遍历map

golang 使用for-range遍历map

for k, v := range m {
   //code
}

k,v分别代表key和这个key对于的值。

如果只想获取key可以

for k := range m {
    fmt.Println(key)
}

如果只想获取value则:

for _, v := range m {
    fmt.Println(v)
}

map的一些特性

  • map中key是不排序的,所以你每一次对map进行for-range打印的结果可能不同
  • golang的map不是线程安全的,在并发读写的时候会触发concurrent map read and map write的panic。解决的办法是自己加把锁。
  • map在删除某个key的时候不是真正的删除,只是标记为空,空间还在,所以在for range删除map元素是安全的。