李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
GO
正文
08.Golang容器之Map
Leefs
2022-06-30 PM
1169℃
0条
[TOC] ### 前言 ![08.GO语言容器值Map01.jpeg](https://lilinchao.com/usr/uploads/2022/06/3493870244.jpeg) ### 一、概念 Go语言中提供的映射关系容器为`map`,其内部使用`散列表(hash)`实现。 map是一种无序的基于`key-value`的数据结构,Go语言中的map是引用类型,必须初始化才能使用。 所有可比较的类型,如 `整型` ,`字符串` 等,都可以作为 `key` 。 #### 二、map定义 #### 2.1 声明方式 map 是引用类型,可以使用如下方式声明: ```go var mapname map[keytype]valuetype ``` **说明** - **mapname** 为 map 的变量名。 - **keytype** 为键类型。 - **valuetype** 是键对应的值类型。 > 提示:[keytype] 和 valuetype 之间允许有空格。 在声明的时候不需要知道 map 的长度,因为 map 是可以动态增长的,未初始化的 map 的值是 nil,使用函数 len() 可以获取 map 中 pair 的数目。 #### 2.2 map 容量 和数组不同,map 可以根据新增的 key-value 动态的伸缩,因此它不存在固定长度或者最大限制,但是也可以选择标明 map 的初始容量 capacity。 **格式如下:** ```go make(map[keytype]valuetype, cap) ``` 当 map 增长到容量上限的时候,如果再增加新的 key-value,map 的大小会自动加 1,所以出于性能的考虑,对于大的 map 或者会快速扩张的 map,即使只是大概知道容量,也最好先标明。 ### 三、map基本使用 **示例** ```go func main(){ scoreMap := make(map[string]int,8) //向map集合中添加元素 scoreMap["Leefs"] = 90 scoreMap["Thyee"] = 100 //打印输出 fmt.Println(scoreMap) //map[Leefs:90 Thyee:100] //输出键Leefs对应的值 fmt.Println(scoreMap["Leefs"]) //90 //修改键Leefs对应的值 scoreMap["Leefs"] = 80 fmt.Println(scoreMap["Leefs"]) //80 //输出数据类型 fmt.Printf("type of a:%T\n",scoreMap) //type of a:map[string]int } ``` **在声明时填充元素** ```go func main(){ userInfo := map[string]string{ "username":"Leefs", "age":"20", } fmt.Println(userInfo) } ``` **运行结果** ``` map[age:20 username:Leefs] ``` ### 四、判断某个键是否存在 Go语言中有个判断map中键是否存在的特殊写法,格式如下: ```go value, ok := map[key] ``` **示例** ```go func main(){ scoreMap := make(map[string]int) scoreMap["Leefs"] = 90 scoreMap["Jeyoo"] = 100 //如果key存在ok为true,v为对应的值;不存在ok为false,v为值类型的零值 v,ok := scoreMap["Leefs"] if ok { fmt.Println(v) }else{ fmt.Println("查询错误") } } ``` ### 五、map的遍历 Go语言中使用`for range`遍历map。 ```go func main(){ scoreMap := make(map[string]int) scoreMap["Leefs"] = 90 scoreMap["Thyee"] = 100 scoreMap["Jeyoo"] = 80 for k,v := range scoreMap{ fmt.Println(k,v) } } ``` **运行结果** ``` Leefs 90 Thyee 100 Jeyoo 80 ``` **如果只想遍历key或value的时候,可以按下面的写法:** + **只遍历key** ```go func main(){ scoreMap := make(map[string]int) scoreMap["Leefs"] = 90 scoreMap["Thyee"] = 100 scoreMap["Jeyoo"] = 80 for k := range scoreMap{ fmt.Println(k) } } ``` + **只遍历value** ```go func main(){ scoreMap := make(map[string]int) scoreMap["Leefs"] = 90 scoreMap["Thyee"] = 100 scoreMap["Jeyoo"] = 80 //将不需要的键使用_改为匿名变量形式 for _,v := range scoreMap{ fmt.Println(v) } } ``` 注意:遍历输出元素的顺序与填充顺序无关,不能期望 map 在遍历时返回某种期望顺序的结果。 > 按照指定顺序遍历map ```go func main(){ rand.Seed(time.Now().UnixNano()) //初始化随机数种子 var scoreMap = make(map[string]int,200) for i:=0;i<100;i++{ key := fmt.Sprintf("stu%02d",i) //生成stu开头的字符串 value := rand.Intn(100) //生成0~99的随机整数 scoreMap[key] = value } //取出map中的所有Key存入切片keys var keys = make([]string,0,200) for key := range scoreMap{ keys = append(keys,key) } //对切片进行排序 sort.Strings(keys) //按照排序后的Key遍历map for _,key := range keys{ fmt.Println(key,scoreMap[key]) } } ``` ### 六、map元素的删除和清空 #### 6.1 删除 使用`delete()`内建函数从map中删除一组键值对,`delete()`函数的格式如下: ```go delete(map, key) ``` **说明** - **map**:表示要删除键值对的map - **key**:表示要删除的键值对的键 **示例** ```go func main(){ scoreMap := make(map[string]int) scoreMap["Leefs"] = 90 scoreMap["Thyee"] = 100 scoreMap["Jeyoo"] = 80 //删除scoreMap集合中的Thyee元素 delete(scoreMap,"Thyee") //遍历scoreMap集合中的元素 for k,v := range scoreMap{ fmt.Println(k,v) } } ``` **运行结果** ``` Leefs 90 Jeyoo 80 ``` #### 6.2 清空 Go语言中并没有为 map 提供任何清空所有元素的函数、方法,清空 map 的唯一办法就是重新 make 一个新的 map,不用担心垃圾回收的效率,Go语言中的并行垃圾回收效率比写一个清空函数要高效的多。 ### 七、其他操作 #### 7.1 元素为map类型的切片 下面的代码演示了切片中的元素为map类型时的操作: ```go func main(){ var mapSlice = make([]map[string]string,3) for index,value := range mapSlice{ fmt.Printf("index:%d value:%v\n",index,value) } fmt.Println("after init") //对切片中的map元素进行初始化 mapSlice[0] = make(map[string]string,10) mapSlice[0]["name"] = "Leefs" mapSlice[0]["age"] = "20" mapSlice[0]["address"] = "朝阳" for index,value := range mapSlice{ fmt.Printf("index:%d value:%v\n",index,value) } } ``` #### 7.2 值为切片类型的map 下面的代码演示了map中值为切片类型的操作: ```go func main(){ var sliceMap = make(map[string][]string, 3) fmt.Println(sliceMap) fmt.Println("after init") key := "中国" value, ok := sliceMap[key] if !ok { value = make([]string, 0, 2) } value = append(value, "北京", "上海") sliceMap[key] = value fmt.Println(sliceMap) } ``` *附参考原文链接* *https://www.liwenzhou.com/posts/Go/08_map/#autoid-1-0-0*
标签:
Golang基础
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2206.html
上一篇
07.Golang容器之切片功能操作
下一篇
09.Golang指针介绍
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Eclipse
Filter
RSA加解密
栈
稀疏数组
MyBatis-Plus
BurpSuite
锁
gorm
Spark Streaming
散列
递归
查找
JavaScript
VUE
JavaWeb
Kibana
Java
序列化和反序列化
ajax
Ubuntu
GET和POST
Java阻塞队列
Tomcat
Java工具类
NIO
线程池
Sentinel
Golang基础
JavaSE
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭