一、map的基本介绍

map 是 key-value 数据结构,又称为字段或者关联数组。类似其它编程语言的集合

二、map的声明

var map 变量名 map[keytype]valuetyp

map的 key 可以是很多种类型,比如 bool, 数字,string, 指针, channel , 还可以是只包含前面几个类型的接口, 结构体, 数组。
通常 key 为 int 、string
注意: slice, map 还有 function 不可以,因为这几个没法用 == 来判断

valuetype 的类型和 key 基本一样
通常为: 数字(整数,浮点数),string,map,struct

map为valuetype的例子

studentMap:=make(map[string]map[string]string)studentMap["stu1"]=make(map[string]string, 3)  //使用前一定要make
studentMap["stu1"]["name"]="tom"
studentMap["stu1"]["sex"]="男"
studentMap["stu1"]["address"]="武汉"fmt.Println(studentMap)            //map[stu1:map[address:武汉 name:tom sex:男]]
fmt.Println(studentMap["stu1"])           //map[address:武汉 name:tom sex:男]
fmt.Println(studentMap["stu1"]["address"])      //武汉

声明举例:
var a map[string]string
var a map[string]int
var a map[int]string
var a map[string]map[string]string

注意事项

1.声明是不会分配内存的,初始化需要 make ,分配内存后才能赋值和使用
2.map 在使用前一定要 make
3.map 的 key 是不能重复,如果重复了,则以最后这个 key-value 为准
4.map 的 value 是可以相同的.
5.map 的 key-value 是无序

三、map的初始化

方式一

var a map[string]string
a=make(map[string]string, 10) //等同于a:=make(map[string]string, 10)
a["no1"]="宋江"
a["no2"]="吴用"
a["no3"]="武松"fmt.Println(a)    //map[no1:宋江 no2:吴用 no3:武松]

方式二

a:=map[string]string{"no1":"宋江","test":"卢俊义","no2":"吴用",
}
a["no4"]="林冲"fmt.Println(a)        //map[no1:宋江 no2:吴用 no4:林冲 test:卢俊义]

方式三:直接初始化

a:=map[string]string{}

该方式和make的区别:

var mm = make(map[int]string)  //这个是用make申明,make 的作用是初始化内置的数据结构,可以对切片、哈希表和 Channel进行初始化;
fmt.Println(mm==nil)  //      falsevar mm2 map[int]string  //这个是像普通类型一样申明,这里的mm2是nil值
fmt.Println(mm2==nil)  //     truemm[1]="123"   //正确 map[1:123]mm2[1]="123"  //错误 没有分配空间,为nilmm2=map[int]string{1:"123"}  //正确  map[1:123]

四、map的增删改查

这是哈希表常用的操作

1.增加/更新

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

2.删除

delete(map,“key”) ,delete 是一个内置函数,如果 key 存在,就删除该 key-value,如果 key不存在,不操作,但是也不会报错

studentMap:=make(map[string]map[string]string)studentMap["stu1"]=make(map[string]string, 3)  //使用前一定要make
studentMap["stu1"]["name"]="tom"
studentMap["stu1"]["sex"]="男"
studentMap["stu1"]["address"]="武汉"studentMap["stu2"]=make(map[string]string, 3)
studentMap["stu2"]["name"]="jack"fmt.Println(studentMap) //map[stu1:map[address:武汉 name:tom sex:男] stu2:map[name:jack]]delete(studentMap["stu1"],"name")fmt.Println(studentMap)  //map[stu1:map[address:武汉 sex:男] stu2:map[name:jack]]delete(studentMap,"stu1")fmt.Println(studentMap) // map[stu2:map[name:jack]]studentMap=make(map[string]map[string]string)fmt.Println(studentMap)    //map[]

如果我们要删除 map 的所有 key ,没有一个专门的方法一次删除,可以遍历一下 key, 逐个删除 或者 map =make(…),make 一个新的,让原来的成为垃圾,被 gc 回收

studentMap=make(map[string]map[string]string)

3.查找

if val,ok:=studentMap["stu2"];!ok{fmt.Println("没找到")
}else{fmt.Println(val,ok)               // map[name:jack] true}if val,ok:=studentMap["stu1"]["name"];!ok{fmt.Println("没找到")
}else{fmt.Println(val,ok)               //tom true}

五、map的遍历

map 的遍历使用 for-range 的结构遍历

for k,v :=range studentMap{fmt.Println(k,v)     for k1,v1:=range v{fmt.Println(k1,v1)}fmt.Println()
}
//顺序是随机的
//stu1 map[address:武汉 name:tom sex:男]
//name tom
//sex 男
//address 武汉//stu2 map[name:jack]
//name jack

map的长度

fmt.Println(len(studentMap))         //2fmt.Println(len(studentMap["stu1"]))   //3

六、map切片

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

heros :=make([]map[string]string, 2)heros[0]=make(map[string]string, 2)heros[0]["name"]="无极剑圣"
heros[0]["level"]="15级"heros[1]=map[string]string{"name":"曙光女神","level":"13级",
}newhero:=map[string]string{"name":"未来守护者","level":"16级",
}heros=append(heros,newhero)fmt.Println(heros) //[map[level:15级 name:无极剑圣] map[level:13级 name:曙光女神] map[level:16级 name:未来守护者]]

七、map排序

  1. golang 中没有一个专门的方法针对 map 的 key 进行排序
  2. golang 中的 map默认是无序的,注意也不是按照添加的顺序存放的,你每次遍历,得到的输出可能不一样
  3. golang 中 map 的排序,是先将 key 进行排序,然后根据 key 值遍历输出即可
number:=make(map[int]string, 10)
number[1]="我"
number[4]="是"
number[8]="学"
number[10]="生"fmt.Println(number)var keys []intfor k,_ := range number {keys=append(keys,k)
}sort.Ints(keys)
fmt.Println(keys)for _,k:=range keys{fmt.Println(k,number[k])
}//1 我
//4 是
//8 学
//10 生

八、map 使用细节

1、map 是引用类型,遵守引用类型传递的机制,在一个函数接收 map,修改后,会直接修改原来的 map。
2、map 的容量达到后,再想 map 增加元素,会自动扩容,并不会发生 panic,也就是说 map 能动态的增长键值对(key-value)

number:=make(map[int]int, 1)
number[1]=1
number[2]=2
fmt.Println(number)     //map[1:1 2:2]

3、map 的 value 也经常使用 struct 类型,更适合管理复杂的数据

type Stu struct{name stringage intaddress string
}func main()  {students :=make(map[string]Stu, 10)stu1 := Stu{"tom",18,"北京",}stu2 := Stu{"marry",28,"上海",}students["no1"]=stu1students["no2"]=stu2fmt.Println(students)    //map[no1:{tom 18 北京} no2:{marry 28 上海}]for k,v := range students {fmt.Println(k,v)        //no1 {tom 18 北京}  no2 {marry 28 上海}}
}

golang对map的理解相关推荐

  1. Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)

    参考: 由浅入深聊聊Golang的sync.Map 通过对源码的逐行分析,清晰易懂 Golang sync.Map原理 通过向 sync.Map 中增删改查来介绍sync.Map的底层原理 Golan ...

  2. golang 中 map 转 struct

    golang 中 map 转 struct package mainimport ("fmt""github.com/goinggo/mapstructure" ...

  3. golang key map 所有_Map的底层实现 为什么遍历Map总是乱序的

    Golang中Map的底层结构 其实提到Map,一般想到的底层实现就是哈希表,哈希表的结构主要是Hashcode + 数组. 存储kv时,首先将k通过hashcode后对数组长度取余,决定需要放入的数 ...

  4. Golang笔记——map

    map 的基本介绍 map 是 key-value 数据结构,又称为字段或者关联数组.类似其它编程语言的集合, 在编程中是经常使用到 map 的声明 基本语法 var map 变量名 map[keyt ...

  5. golang导入包的理解

     golang导入包的理解 1.首先是包的引入原理 程序的初始化和执行都起始于main包.如果main包还导入了其它的包,那么就会在编译时将它们依次导入.有时一个包会被多个包同时导入,那么它只会被 ...

  6. GoLang之map底层系列二(浅显学习)

    文章目录 GoLang之map底层系列二(浅显学习) 1.map++ 2.map引用传递 3.map不是并发安全 4.map的value为空接口 5.map的value为切片 6.value,ok=m ...

  7. GoLang之Map深度讲解

    文章目录 GoLang之Map深度讲解 1.Map查找 2.哈希函数 3.Map插入.修改 4.扩容分析 GoLang之Map深度讲解 1.Map查找 //以下常量在runtime/map.go里 c ...

  8. 计算机视觉中的MAP的理解(mean average precision)

    计算机视觉中的MAP的理解(mean average precision) 精准率(Precision, P值)和召回率(Recall,R值) 下面我们来讲AP(average precision) ...

  9. golang对map排序

    golang中map元素是随机无序的,所以在对map range遍历的时候也是随机的,不像php中是按顺序.所以如果想按顺序取map中的值,可以采用以下方式: import ("fmt&qu ...

最新文章

  1. FastJson解析
  2. 关于程序员就业岗位及岗位市场的思考
  3. PowerDesigner新建模板
  4. matlab自带kfcm函数,kfcmFun.m
  5. mysql5.0.27+apache2.0.59+php5.2.0+phpMyAdmin-2.6.4-pl3
  6. XP下安装装SQL2000企业版本
  7. 中国移动老功臣退休致辞:工作结束了 人生没结束
  8. Linux 命令(119)—— diff 命令
  9. Android 自定义拍照,解决图片旋转,拍照参数设置兼容问题
  10. 对复杂字典DictionaryT1,T2排序问题
  11. ITxlab倡议启动“互联网X大脑”计划
  12. 百度人脸识别使用总结(环境+测试+人脸库管理)
  13. 虚拟大师怎么修改手机_怎么修改手机应用名称
  14. winrar打包bat成exe并自动运行
  15. N卡怎么修改录屏文件保存位置
  16. linux和嵌入式开发区别,嵌入式开发与普通编程开发的区别
  17. 51单片机:P1口输入/输出实验1(控制发光二极管亮灭)
  18. vue面试五之vue修饰符中 .lazy 等用法、Vue v2.4中新增的$attrs及$listeners属性的使用、v-once 的使用场景、vue组件里的定时器该如何销毁、vue海量数据优化等
  19. 樊登读书会终身成长读后感_樊登读书会听书《终身成长》学习感悟
  20. 生物信息学仿真软件SInC的初步使用教程

热门文章

  1. 注册MDL(My Digital Life Forums)论坛账号
  2. 天秀! 了解一下GAN都可以做到这些事情
  3. android餐厅菜单功能,基于Android平台的菜谱实现
  4. php饮餐管理顾客流程,餐饮管理:难缠的顾客是机遇,这样做能让你的餐厅回头客不断...
  5. C#依赖注入常用的几种方式
  6. 【网络】HTTPS协议详解
  7. Xcode 8 中阶调试技巧
  8. 二维数组赋值给vector
  9. python-16-名片管理系统
  10. Android添加系统service