Go(05)map介绍
原文地址:
http://www.limerence2017.com/2019/06/11/golang06/
基本用法
map同样也是引用类型,map在使用前需要通过make进行初始化,否则会报panic错误。
map 初始化和插入
12345678910 |
type PersonInfo struct { ID string Name string Address string } var personDB map[string]PersonInfo personDB = make(map[string]PersonInfo) personDB["12345"] = PersonInfo{"12345", "Tom", "Room 203"} personDB["1"] = PersonInfo{"1", "Jack", "Room 102"} |
可以看到map使用前用make先构造初始化,之后进行了插入,如果key存在,则修改value
map 查找
1234567 |
//从这个map查找键为"1234" person, ok := personDB["1234"] if ok { fmt.Println("Found person", person.Name, "with ID 1234") } else { fmt.Println("Did not find person with ID 1234") } |
查找指定key,返回值为value和bool类型结果,所以先判断bool类型值是否为true
map 进阶
map可以直接显示初始化不需要make构造。
1 |
var data map[string]int = map[string]int{"bob": 18, "luce": 28} |
map是引用类型,函数通过修改形参,达到修改外部实参的功能
1234567891011121314151617 |
func modify(data map[string]int, key string, value int) { v, res := data[key] //不存在,则res是false if !res { fmt.Println("key not find") return } fmt.Println("key is ", key, "value is ", v) data[key] = value} func main() { var data map[string]int = map[string]int{"bob": 18, "luce": 28} modify(data, "lilei", 28) modify(data, "luce", 22) fmt.Println(data)} |
map 大小可以通过len函数获得,如果不采用显示初始化方式,只声明map,在使用前一定要make初始化
map遍历采用range方式,且map是无序的,切记。
1234567891011121314151617 |
//map大小 fmt.Println(len(data)) //map 使用前一定要初始化,可以显示初始化,也可以用make var data2 map[string]int = make(map[string]int, 3) fmt.Println(data2) //当key不存在时,则会插入 data2["sven"] = 19 fmt.Println(data2) //当key存在时,则修改 data2["sven"] = 299 fmt.Println(data2) data2["Arean"] = 33 data2["bob"] = 178 //map是无序的,遍历输出 for key, value := range data2 { fmt.Println("key: ", key, "value: ", value) } |
上面的代码遍历map,打印结果为
123 |
key: bob value: 178key: sven value: 299key: Arean value: 33 |
可以实现一个函数,将map中的key存到slice中,然后排序,之后根据排好顺序的slice遍历
得到的就是排序后的结果
123456789101112131415 |
func sortprintmap(data map[string]int) { slice := make([]string, 0) for k, _ := range data { slice = append(slice, k) } sort.Strings(slice) for _, s := range slice { d, e := data[s] if !e { continue } fmt.Println("key is ", s, "value is ", d) }} |
在main函数调用sortprintmap(data2),结果如下
123 |
key is Arean value is 33key is bob value is 178key is sven value is 299 |
二维map
二维map操作和之前类似,只是声明时value还是一个map
12 |
//二维map var usrdata map[string]map[string]int |
二维map同样遵循使用前先make初始化原则,并且在二层map要使用前仍然需要make
123456789 |
//使用前需要初始化 usrdata = make(map[string]map[string]int) usrdata["sven"] = make(map[string]int) usrdata["sven"]["age"] = 21 usrdata["sven"]["id"] = 1024 usrdata["susan"] = make(map[string]int) usrdata["susan"]["age"] = 19 usrdata["susan"]["id"] = 1000 |
二维map遍历
123456 |
//二维map 遍历 for k, v := range usrdata { for k2, v2 := range v { fmt.Println(k, " ", k2, " ", v2) } } |
slice 中存储map
1234567 |
//slice of map slicem := make([]map[string]int, 5) for i := 0; i < len(slicem); i++ { slicem[i] = make(map[string]int) } fmt.Println(slicem) |
本着golang所有引用类型,如chan,map,slice,interface,使用前都需要make初始化。
上面代码先初始化slicem,然后再遍历slice,为每个元素初始化map类型
map 反转
1234567 |
//map 反转 rvmap := make(map[int]string) for k, v := range data2 { rvmap[v] = k } fmt.Println(rvmap) fmt.Println(data2) |
其实就是构造一个和原map 的key value相反的map,然后为该map初始化并且插入元素。
上述所有源码下载地址
源码下载地址
谢谢关注我的公众号
转载于:https://www.cnblogs.com/secondtonone1/p/11107499.html
Go(05)map介绍相关推荐
- Source Map介绍 -浏览器篇
Source Map介绍 - 浏览器篇 Source Map介绍 浏览器source map source map 使用介绍和原理 浏览器支持 参考链接 Source Map介绍 在做网站性能优化的时 ...
- 【Java】Map介绍和使用
目录 [1]Map使用场景 [2]概念 [3]Map 的常用方法 [4]关于Map.Entry的说明 1.Map.Entry的作用 2.Map.Entry中的常用方法 3.使用Map.Entry遍历M ...
- 字节码学院之map介绍
Java集合框架中的 map 其实就是大家常说的数据结构中的图,或者就是python 语言中的字典,就是由键值对组成的数据结构: java中的map的键(key)是不可以重复,而value是可以重复的 ...
- observable.map 介绍
Observable 映射 observable.map(values, options?) observable.map(values?) - 创建一个动态键的 observable 映射. 如果你 ...
- Open Street Map介绍以及相关使用教程
看不太懂,但感觉有用的东西.Openstreetmap 是什么? 用来入门(或者说先知道这是什么)简单的百度百科介绍 这个链接展示了如何下载一定格式的地图(shp.osm格式). OpenStreet ...
- Route map介绍(转贴)
策略路由配置命令 route map和ACL很类似,它可以用于路由的再发布和策略路由,还经常使用在BGP中.策略路由(policy route)实际上是复杂的静态路由,静态路由是基于数据包的目标地址并 ...
- Python中映射函数map介绍
map是python中的一个内置工具,它是函数式编程(对序列应用一些函数)中最简单的一类内置函数.它的作用是将一个序列放到一个函数中.比如我们要将列表元素都加十,可以用如下方法: lis = [1,2 ...
- java scan map_键盘键位(Scancode Map)详细介绍
键位的Scancode Map介绍(英文): http://download.microsoft.com/download/whistler/hwdev3/1.0/WXP/EN-US/scancode ...
- Apollo map模块地图、地图格式以及地图元素介绍
Apollomap模块入门 一.map 生成流程 二.map 介绍 坐标 车道 其中重点介绍车道与路口部分. 道路Road 车道Lane 路口Junction 获取高精度地图元素 一.map 生成流程 ...
最新文章
- Django学习之路(一)--初识django
- linux shell 字符串操作(长度,查找,替换)详解
- mac下webstorm 安装
- 二、LInux系统安装Java
- useradd: cannot open /etc/passwd解决办法记录
- php 去除中英文空格,php 去除所有空格 包括中文空格圆角空格
- 【问题解决】nuget 打包 Unable to find “****.nupkg”.make sure the project has been built. 问题参考
- js生成二维码的几种方法
- 什么是驱动程序 在计算机中有何用途,电脑的驱动程序有什么作用
- raid卡直通模式会走缓存吗_【IT之家学院】Raid到底是啥?
- 程序员学习时间的由来
- HomeKit 设备接入协议
- android电脑局域网传输方案,通过WiFi文件传输在Android和PC之间传输文件 | MOS86
- 优化-规划问题(数学建模)
- Anchor Based和Anchor Free的相爱相杀与ATSS的诞生
- Word排版之段落样式+如何创建一个三线表外观的表格样式
- 图片放大不影响画质怎么做?这样放大不失真
- Hive管理之Web界面和远程管理
- 2017年全球FinTech变革全景揭秘及前景展望
- 云深互联:跨越界限的集成者