map的介绍:
map是key-value数据结构,又称为字段或者关联数组。类似其他编程语言的集合,在编程中是经常使用的;
基本语法:
var map 变量名 map[key type]value type
key 可以是什么类型?
golang中的map的key可以是很多种类型,比如bool, 数字,string, 指针,channel,还可以是只包含前面几个类型的接口,结构体,数组,通常为int,string;
注意:slice map function 不可以做key,因为这几个没法用 == 来判断是否key是否存在;key不能重复
value 可以是什么类型?
value的类型和key基本一样,通常为:数字(整数,浮点数),string,map,struct;
map的声明
注意:map声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用;map是无序的;
map的使用方式:
var mp map[string]string
mp = make(map[string]string, 10) // make的作用就是给map分配数据空间
mp["no1"] = "宋江"
mp["no2"] = "吴用"
mp["no3"] = "武松"
mp["no1"] = "鲁智深"
fmt.Println(mp) // map[no1:鲁智深 no2:吴用 no3:武松]
// 第二种定义方式 (推荐)
cities := make(map[string]string)
cities["no1"] = "北京"
cities["no2"] = "上海"
cities["no3"] = "天津"
fmt.Println(cities) // map[no1:北京 no2:上海 no3:天津]
// 第三种方式
var roles map[string]string = map[string]string {"no1": "孙悟空", "no2": "猪八戒", "no3": "沙和尚"}
// roles := map[string]string {"no1": "孙悟空", "no2": "猪八戒", "no3": "沙和尚"}
roles["no4"] = "唐僧"
fmt.Println(roles) // map[no1:孙悟空 no2:猪八戒 no3:沙和尚 no4:唐僧]
map的crud操作
map增加和更新:
map["key"] = value // 如果key还没有,就是增加,如果key存在就是修改;
map删除:
delete(map, "key"); delete是一个内置函数,如果key存在,在删除该key-value,如果key不存在,不操作,但是也不会报错;
如果希望一次性删除所有的key
1.遍历所有的key,然后逐一删除;
2.直接make一个新的空间;
map查找:
val, findres := map["key"]
如果map中存在 key,那么 findres 就会返回true,否则返回false
map的遍历
说明:map的遍历使用for-range 的结构遍历;因为map的key不一定是数字,即使是数字也不一定是连续的数字
map的长度
使用内置函数 len ---> len(map)
map切片
切片的数据类型如果是map,则我们称为 slice of map , map切片, 这样使用则map个数可以动态变化了。[]map[string]string(类比 []int)
需要用到 切片的append方法
map排序
golang中没有一个专门的方法针对map的key进行排序;
golang中的map默认是无序的,注意也不是按照添加的顺序存放的,你每次遍历,得到的输出可能不一样;
golang中的map的排序,是先将key进行排序,然后根据key值遍历输出即可;
map的排序做法:
先将map的key 放入到 切片中
对切片排序 (sort.Ints([]slice))
遍历切片,然后按照key来输出map的值
map使用细节和注意事项
1.map是引用类型,遵守引用类型传递的机制,在一个函数接收map,修改后,会直接修改原来的map;
2.map的容量达到后,再想map增加元素,会自动扩容,并不会发生panic,也就是说map能动态的增长键值对(key-value)
3.map的value 也经常使用struct 类型,更适合管理复杂的数据(比前面value是一个map更好);