Golang map实现原理浅析

map的声明

基本语法

var map变量名 map[keytype]valuetype

key可以是什么类型

golang中的map,的key可以是很多中类型,比如bool,数字,string,指针,channel,还可以是包含前面几个类型的 接口,结构体,数组

通常为int,string

valuetype 可以是什么类型

valuetype的类型和key基本一样,这里我就不再赘述了

通常为:数字(整数,浮点数),string,map,struct

注意:slice,map还有function不可以,因为这几个没法用==来判断

map声明

例子

var a map[string]string

var a map[string]int

var a map[string]string

var a map[string]map[string]string

注意:声明是不会分配内存的,初始化需要make,分配内存后才能赋值和使用。

  • map在使用前一定要make
  • map的key是不能重复,如果重复了,则以最后这个key-value为准
  • map的value是可以相同的
  • map的key-value是无序的

map使用的方式

使用

map增加和更新

map增加和更新:

map[“key”] = value // 如果key还没有,就是增加,如果key存在就是修改。

map删除

map查找

对上面代码说明:

说明:如果heroes这个map中存在“no1”,那么findRes就会返回true,否则返回false

map遍历

map的长度:

func len(v type) int

map切片

基本介绍

切片的数据类型如果是map,则我们称为slice of map,map切片,这样使用map个数就可以动态变化了。

案例演示

要求:使用一个map来记录monster的信息name和age,也就是说monster对应一个map,并且妖怪的个数可以东态的增加=》map切片

map 排序

基本介绍

  • golang中没有一个专门的方法针对map的key进行排序
  • golang中的map默认是无序的,注意也不是按照添加的顺序存放的,你每次遍历,得到的输出可能不一样
  • golang中的map的排序,是先将key进行排序,然后根据key值遍历输出即可

map使用细节

  • map是引用类型,遵循引用类型传参的机制,在一个函数接收map,修改后,会直接修改原来的map
  • map的容量达到后,再想map增加元素,会自动扩容,并不会发生panic,也就是说map能动态的增长键值对(key-value)
  • map的value也经常使用struct类型,更适合管理复杂的数据(比前面value是一个map更好),比如value为student结构体

map的练习题

  • 使用map[string]map[string]string 的map类型
  • key:表示用户名,是唯一的,不可以重复
  • 如果某个用户名存在,就将其密码改为888888,如果不存在就增加这个用户信息,(包括昵称nickname和密码pwd)
  • 编写一个函数modifyUser(users map[string]map[string]string,name string) 完成上述功能

代码实现: