golang对map的理解
一、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排序
- golang 中没有一个专门的方法针对 map 的 key 进行排序
- golang 中的 map默认是无序的,注意也不是按照添加的顺序存放的,你每次遍历,得到的输出可能不一样
- 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的理解相关推荐
- Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)
参考: 由浅入深聊聊Golang的sync.Map 通过对源码的逐行分析,清晰易懂 Golang sync.Map原理 通过向 sync.Map 中增删改查来介绍sync.Map的底层原理 Golan ...
- golang 中 map 转 struct
golang 中 map 转 struct package mainimport ("fmt""github.com/goinggo/mapstructure" ...
- golang key map 所有_Map的底层实现 为什么遍历Map总是乱序的
Golang中Map的底层结构 其实提到Map,一般想到的底层实现就是哈希表,哈希表的结构主要是Hashcode + 数组. 存储kv时,首先将k通过hashcode后对数组长度取余,决定需要放入的数 ...
- Golang笔记——map
map 的基本介绍 map 是 key-value 数据结构,又称为字段或者关联数组.类似其它编程语言的集合, 在编程中是经常使用到 map 的声明 基本语法 var map 变量名 map[keyt ...
- golang导入包的理解
golang导入包的理解 1.首先是包的引入原理 程序的初始化和执行都起始于main包.如果main包还导入了其它的包,那么就会在编译时将它们依次导入.有时一个包会被多个包同时导入,那么它只会被 ...
- GoLang之map底层系列二(浅显学习)
文章目录 GoLang之map底层系列二(浅显学习) 1.map++ 2.map引用传递 3.map不是并发安全 4.map的value为空接口 5.map的value为切片 6.value,ok=m ...
- GoLang之Map深度讲解
文章目录 GoLang之Map深度讲解 1.Map查找 2.哈希函数 3.Map插入.修改 4.扩容分析 GoLang之Map深度讲解 1.Map查找 //以下常量在runtime/map.go里 c ...
- 计算机视觉中的MAP的理解(mean average precision)
计算机视觉中的MAP的理解(mean average precision) 精准率(Precision, P值)和召回率(Recall,R值) 下面我们来讲AP(average precision) ...
- golang对map排序
golang中map元素是随机无序的,所以在对map range遍历的时候也是随机的,不像php中是按顺序.所以如果想按顺序取map中的值,可以采用以下方式: import ("fmt&qu ...
最新文章
- FastJson解析
- 关于程序员就业岗位及岗位市场的思考
- PowerDesigner新建模板
- matlab自带kfcm函数,kfcmFun.m
- mysql5.0.27+apache2.0.59+php5.2.0+phpMyAdmin-2.6.4-pl3
- XP下安装装SQL2000企业版本
- 中国移动老功臣退休致辞:工作结束了 人生没结束
- Linux 命令(119)—— diff 命令
- Android 自定义拍照,解决图片旋转,拍照参数设置兼容问题
- 对复杂字典DictionaryT1,T2排序问题
- ITxlab倡议启动“互联网X大脑”计划
- 百度人脸识别使用总结(环境+测试+人脸库管理)
- 虚拟大师怎么修改手机_怎么修改手机应用名称
- winrar打包bat成exe并自动运行
- N卡怎么修改录屏文件保存位置
- linux和嵌入式开发区别,嵌入式开发与普通编程开发的区别
- 51单片机:P1口输入/输出实验1(控制发光二极管亮灭)
- vue面试五之vue修饰符中 .lazy 等用法、Vue v2.4中新增的$attrs及$listeners属性的使用、v-once 的使用场景、vue组件里的定时器该如何销毁、vue海量数据优化等
- 樊登读书会终身成长读后感_樊登读书会听书《终身成长》学习感悟
- 生物信息学仿真软件SInC的初步使用教程