map映射是golang提供的key-value键值对,形式的无序集合,即其他语言中的hash表,键值对的键有唯一性要求,可以通过键来获取值或者更新值。

 map的底层是一个hash表,但是map通过封装吧hash表的一些具体实现进行了隐藏,用户可以便捷的使用map

map类型的形式 map[k]v

其中k是键,在同一个map中所有k必须是同一个类型,而且只有可以比较,或者说只有可以使用== 符号比较的类型才可以作为K,显然bool类型作k 并不灵活,而使用浮点型作为k,可能会因为不同机器和系统对于精度定义的不同而导致异常

在同一个map中,v也只能是同一类型,在定义V的时候,可以选择任何类型,没有限制

基本操作

m1 := make (map[string]int)

通过上面的方式创建了一个k类型为stringv类型为int的map

用户可以直接使用map关键字创建带有初始值的map

m2 := map[string]int {

“k1”:11,

"k2": 22

}

如果要访问11这个值,就要使用m2["k1"]的方式,如果要删除改元素,则使用delete

delete(m2,"k1")

先通过make函数定义一个映射map,然后给该map增加了k1:11  k2:22两个键值对

先用delete函数吧K1键值对删除,然后再delete一次,没有k1,还是不会报错。也就是说删除一个map中没有的键时并不会报错。

然后var m2  map[string]int 方式定义了,但是没有带初始值,这时候在赋值就会报错

注意:

map 在元素赋值之前必须初始化,要么使用make函数,要么声明的时候就带着初始值,这样比较安全,防止panic

上例中,delete函数执行时,没有元素也不会报错,虽然map中没有该键,但是不会报错,而是会返回值类型的默认值初始值,int的初始值就是0

 map类型的默认值是nil,也就是说未初始化的map是nil,尽管如此,未初始化的map执行删除元素,len操作,range操作或者查找元素时都不会报错。但是如果在初始化之前进行元素赋值则会报错

map的遍历顺序是不固定的,不同的机器可能对HASH算法的使用会有所不同,而且从实际应用来看,mao的遍历顺序确实体现出无序的特征。如果要对map排序,需要对key进行排序,然后根据安装key的顺序取值来达到map排序的效果

slice相比,map除了本身的key-value结构之外,对底层内存的使用也是更为高效。map的value可以使struct等复合机构数据类型,所以使用是不叫灵活的