目录
1、概述
2、声明
3、初始化
4、操作
4.1获取元素的数量
4.2访问
4.3判断key是否存在
4.4修改和增加
4.5删除
4.6遍历
4.7多级map
1、概述map(映射)是存储一系列无序的key/value对,通过key来对value进行操作(增、删、改、查)。映射的key只能为可使用==运算符的值类型(字符串、数字、布尔、数组),value可以为任意类型
map的设计也被称为Thedictionaryproblem,它的任务是设计一种数据结构用来维护一个集合的数据,并且可以同时对集合进行增删查改的操作
Go里的map用于存放key/value对,在其它地方常称为hash、dictionary、关联数组,这几种称呼都是对同一种数据结构的不同称呼,它们都用于将key经过hash函数处理,然后映射到value,实现一一对应的关系
映射是存储一系列无序的key/value对,通过key来对value进行操作(增、删、改、查)
2、声明map的key至少可以有==、!=运算,值可以为整数、字符串、数组
value可以是任意类型
map声明需要指定组成元素key和value的类型,在声明后,会被初始化为nil,表示暂不存在的映射0
varscoresmap[string]int//nil映射,光声明map类型但是没有初始化fmt.Printf("%T%#v\n",scores,scores)fmt.Println(scores==nil)//true
关于nilmap和空map
空map是不做任何赋值的map
a:=map[int]string
nilmap,它将不会做任何初始化,不会指向任何数据结构
varamap[int]string
如何map没初始化,直接赋值会报空指针
varamap[int]stringvarb[]stringfmt.Printf("%p,%p\n",a,b)//a[0]="a"//b[0]="a"a=map[int]string{0:"a"}b=[]string{"a"}fmt.Printf("%p,%p\n",a,b)
所以,map类型实际上就是一个指针,具体为*hmap
3、初始化a)使用字面量初始化并赋值map[ktype]vtype{k1:v1,k2:v2,…,kn:vn}
b)使用字面量初始化空映射map[ktype]vtype{}
c)使用make函数初始化make(map[ktype]vtype),通过make函数创建映射,指定容量
//scores=map[string]int{}scores=map[string]int{"a":8,"b":9,"c":10}fmt.Println(scores)//scores=make(map[string]int,8)//声明map的同时完成初始化b:=map[int]bool{1:true,2:false,}4、操作4.1获取元素的数量
使用len函数获取映射元素的数量
4.2访问当访问key存在与映射时则返回对应的值,否则返回值类型的零值
4.3判断key是否存在通过key访问元素时可接收两个值,第一个值为value,第二个值为bool类型表示元素是否存在,若存在为true,否则为false
4.4修改和增加使用key对映射赋值时当key存在则修改key对应的value,若key不存在则增加key和value
4.5删除使用delete函数删除映射中已经存在的key
4.6遍历可通过for-range对映射中个元素进行遍历,range返回两个元素分别为映射的key和value
上述操作示例:
//增删改查//keyfmt.Println(scores["a"])//8fmt.Println(scores["d"])//0key不存在则为0,但这样不准确//v,ok:=scores["c"]//ifok{ifv,ok:=scores["c"];ok{fmt.Println(v)fmt.Println(ok)//false判断某个键是否存在}scores["b"]=10fmt.Println(scores)scores["d"]=20fmt.Println(scores)//删除delete(scores,"c")//按照key删除fmt.Println(scores)//获取当前映射元素的数量fmt.Println(len(scores))//遍历key、valuefork,v:=rangescores{fmt.Println(k,v)//遍历的顺序和添加的顺序是没有任何关系的}//只遍历map中的keyfork:=rangescores{fmt.Println(k)//遍历的顺序和添加的顺序是没有任何关系的}//只遍历map中的valuefor_,v:=rangescores{fmt.Println(v)}按照某个固定顺序遍历map
默认情况下,对map遍历后都是无序的,可以通过将map中的key存到切片中,然后对切片元素排序,最终实现对map的有序遍历
packagemainimport("fmt""math/rand""sort""time")funcmain(){rand.Seed(time.Now().UnixNano())//初始化随机数种子varscoreMap=make(map[string]int,)fori:=0;i;i++{key:=fmt.Sprintf("stu%02d",i)//生成stu开头的字符串value:=rand.Intn()//生成0~99的随机整数scoreMap[key]=value}//正常遍历,无序//fork,v:=rangescoreMap{//fmt.Println(k,v)//}//有序遍历,按照key从小到大的顺序遍历scoreMap//1、取出map中的所有key存入切片keysvarkeys=make([]string,0,)//定义切片forkey:=rangescoreMap{//把key添加到切片中keys=append(keys,key)}//2、对切片进行排序sort.Strings(keys)//3、按照排序后的key遍历mapfor_,key:=rangekeys{fmt.Println(key,scoreMap[key])}}4.7多级map
多级映射:定义映射的映射
//名字=映射[字符串]字符串{"1","2","3"}varusersmap[string]map[string]stringusers=map[string]map[string]string{"北京":{"1":"朝阳","2":"东城","3":"西城"}}fmt.Printf("%T,%#v\n",users,users)_,ok:=users["上海"]fmt.Println(ok)//falseusers["上海"]=map[string]string{"1":"浦东","2":"徐汇","3":"静安"}fmt.Println(users)//map[上海:map[1:浦东2:徐汇3:静安]北京:map[1:朝阳2:东城3:西城]]users["上海"]["3"]="虹桥"fmt.Println(users)//map[上海:map[1:浦东2:徐汇3:虹桥]北京:map[1:朝阳2:东城3:西城]]delete(users["北京"],"1")fmt.Println(users)//map[上海:map[1:浦东2:徐汇3:虹桥]北京:map[2:东城3:西城]]SSgeek