原文地址:

http://www.limerence2017.com/2019/06/11/golang06/

基本用法

map同样也是引用类型,map在使用前需要通过make进行初始化,否则会报panic错误。

map 初始化和插入

1
2
3
4
5
6
7
8
9
10
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 查找

1
2
3
4
5
6
7
//从这个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是引用类型,函数通过修改形参,达到修改外部实参的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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是无序的,切记。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//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,打印结果为

1
2
3
key:  bob value:  178
key: sven value: 299
key: Arean value: 33

可以实现一个函数,将map中的key存到slice中,然后排序,之后根据排好顺序的slice遍历
得到的就是排序后的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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),结果如下

1
2
3
key is  Arean value is  33
key is bob value is 178
key is sven value is 299

二维map

二维map操作和之前类似,只是声明时value还是一个map

1
2
//二维map
var usrdata map[string]map[string]int

二维map同样遵循使用前先make初始化原则,并且在二层map要使用前仍然需要make

1
2
3
4
5
6
7
8
9
//使用前需要初始化
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遍历

1
2
3
4
5
6
//二维map 遍历
for k, v := range usrdata {
for k2, v2 := range v {
fmt.Println(k, " ", k2, " ", v2)
}
}

slice 中存储map

1
2
3
4
5
6
7
//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 反转

1
2
3
4
5
6
7
//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初始化并且插入元素。

上述所有源码下载地址
源码下载地址
谢谢关注我的公众号

Go(05)map介绍的更多相关文章

  1. go语言基础之map介绍和使用

    1.map介绍 Go语言中的map(映射.字典)是一种内置的数据结构,它是一个无序的key—value对的集合,比如以身份证号作为唯一键来标识一个人的信息. 2.map示例 map格式为: map[k ...

  2. java集合系列——Map介绍(七)

    一.Map概述 0.前言 首先介绍Map集合,因为Set的实现类都是基于Map来实现的(如,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的). 1:介绍 将键映射到 ...

  3. perl中的默认变量与Z/map介绍

    use v6; =begin pod @*ARGS 命令行参数, 不含脚本名 $*PROGRAM-NAME:当前运行脚本的相对路径 $*PROGRAM:当前运行脚本的文件名称 $*CWD:当前工作路径 ...

  4. iOS开发多线程篇 05 —GCD介绍

    iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...

  5. 几种线程相关的map介绍

    Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的. 看下面两个场景: 1.当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全不 ...

  6. java集合系列——Map之HashMap介绍(八)

    1.HashMap的简介 (JDK1.7.0_79版本) HashMap是基于哈希表的Map实现的的,一个Key对应一个Value,允许使用null键和null值,不保证映射的顺序,特别是它不保证该顺 ...

  7. Map集合、散列表、红黑树介绍

    前言 声明,本文用得是jdk1.8 前面已经讲了Collection的总览和剖析List集合: Collection总览 List集合就这么简单[源码剖析] 原本我是打算继续将Collection下的 ...

  8. map,hash_map和unordered_map 实现比较

    map介绍 Map是STL[1]的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处 ...

  9. JavaScript之Map对象

    前言 工欲善其事,必先利其器.这是一款以前在前端项目中没有使用过的.有趣的对象,咱来看看如何使用~ 并非arrayObj.map(function) //arrayObj.map与arrayObj.f ...

随机推荐

  1. Efficient Estimation of Word Representations in Vector Space (2013)论文要点

    论文链接:https://arxiv.org/pdf/1301.3781.pdf 参考: A Neural Probabilistic Language Model (2003)论文要点  https ...

  2. HTML5日期时间输入类型注意事项(time,date)

    原文链接:http://www.webhek.com/post/html5-date.html 1.HTML5规范里只规定date新型input输入类型,并没有规定日历弹出框的实现和样式.所以,各浏览 ...

  3. Linux下的启动oracle服务 启动监听 开放端口操作

    尝试登录oracle 使用root用户将没有sqlplus命令 [root@localhost ~]# sqlplus /nolog bash: sqlplus: 未找到命令...     [root ...

  4. tomcat9.0 问题汇总

    安装时提示 Failed installing tomcat9 service 是因为之前安装tomcat,然后直接删除文件夹,虽然把文件夹删除了,但是重新安装时,服务存在相同的服务名,解决办法:使用 ...

  5. 组件(2):使用Prop下发数据

    数据下发 组件实例的作用域是相互独立的,父.子组件之间无法进行数据的共享.如果想在子组件模板中使用父组件的数据,可以通过Prop将父组件的数据下发到子组件.子组件用props选项声明它预期的数据. 为 ...

  6. shell知识点(一)

    Shell1.概述Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核还是一个功能相当强大的编程语言,易编写.易调试.灵活性强2.shell解析器查看linux提供的shell ...

  7. grunt-contrib-jshint js代码检查

    grunt-contrib-jshint:用于javascript代码检查(并会给出建议),发布js代码前执行jshint任务, 可以避免出现一些低级语法问题jshint拥有非常丰富的配置,可以自由控 ...

  8. 前端js之JQuery

    目录 jQuery介绍 jQuery的优势 jQuery内容 jQuery对象 jQuery基础语法结构 jQuery 使用注意事项 查找标签 基本选择器 层级选择器 基本选择器 属性选择器 表单筛选 ...

  9. 【Winfrom-DataTable填充ListView】ListView与DataTable相互转换 .net

    1.DataTable转成ListView: 先遍历DataTable的列,把DataTable列名添加到listView列头. 然后外循环添加行,内循环添加列 跟这篇文章是一样的 http://ww ...

  10. 3、Grid、GridSplitter 网格分离器、SharedSizeGroup 共享尺寸组

    Grid——网格布局,是WPF中最强大的布局容器,可以实现任何其他容器的布局.一个网格中只展示一个元素,若要展示多元素,可用容器 布局舍入:网格的边界有时会模糊,如三等分100宽度无法被整除.推荐设定 ...