本文首发于公众号:Hunter后端

原文链接:Golang基础笔记四之map

这一篇笔记介绍 Golang 里 map 相关的内容,以下是本篇笔记目录:

  1. map 的概念及其声明与初始化
  2. map 的增删改查
  3. map 的遍历

1、map 的概念及其声明与初始化

map,即映射,是 Golang 里无序键值对的集合。

以下是创建 map 的两种方式。

1. 使用 make 的方式创建

    m := make(map[string]int)
m["Hunter"] = 1
fmt.Println(m)

使用 make 进行初始化的时候,也可以指定其容量大小:

m := make(map[string]int, 4)

2. 映射字面量初始化

    m := map[string]int{
"Hunter": 1,
}
fmt.Println(m)

注意:当我们声明一个 map 之后,它的值是 nil,即 Go 里的空值,一定要对其初始化之后才可向其中添加元素。

比如下面的操作会引发错误:

    var m map[string]int
m["Hunter"] = 1 // 错误,需要初始化

下面的操作才是正确的操作:

    var m map[string]int
m = make(map[string]int)
m["Hunter"] = 1
fmt.Println(m)

介绍这个操作是因为在多重 map 或者说嵌套的 map 里很容易忘记这个操作。

3. 多重 map

比如我们想创建一个多重 map,其示例数据如下:

{
"张三": {
"number": "00001",
"email": "123@qq.com"
},
"李四": {
"number": "00002",
"email": "456@qq.com"
}
}

我们可以如此操作:

var m = make(map[string]map[string]string)
m["张三"] = make(map[string]string)
m["张三"]["number"] = "00001"
m["张三"]["email"] = "123@qq.com" m["李四"] = make(map[string]string)
m["李四"]["number"] = "00002"
m["李四"]["email"] = "456@qq.com" fmt.Println(m)

2、map 的增删改查

我们先定义一个 map 如下:

m := make(map[string]int)

1. 增

如果想要往其中增加一个 key-value,可以直接添加:

m["a"] = 1

2. 改

如果想要修改其中的值,跟增加一个元素的操作一样:

m["a"] = 2

3. 查

如果想查询某个 key 对应的 value,可以如下操作:

value := m["a"]
fmt.Println(value)

而如果这个 key 是不存在的,这个操作也不会报错,而是会返回对应 value 类型的零值。

所谓零值,就是变量被声明但却未显式初始化时,系统自动赋予该变量的默认值,比如整型变量的零值是 0,布尔型的零值是 false,字符串的零值是空字符串 "" 等。

比如这里我们获取 key = "b",其返回的结果就是 int 型的零值 0:

value := m["b"]
fmt.Println(value) // 0

这里如果我们要区分 map 中这个 key 对应的 value 值是 0,还是这个 key 不存在于 map 中的话,有时候会不太好判断,那么我们可以用另一种方式来操作:

value, exists := m["b"]
if exists {
fmt.Printf("m 存在 key 为 b 的数据,value 为 %d", value)
} else {
fmt.Printf("m 不存在 key 为 b 的数据")
}

4. 删

如果想要删除 map 中的某个 key,可以如下操作:

delete(m, "a")

这里,即便是对应的 key 不存在于 map 中,这个操作也不会报错。

5. 清空 map

如果想要清空一个 map,可以使用 for 循环对 map 的 key 挨个删除:

m := map[string]int{
    "a": 1,
    "b": 2,
    "c": 3,
}
fmt.Println(m)
for key, _ := range m {
    delete(m, key)
}
fmt.Println(m)

另一种更高效的方案就是重新对其初始化操作:

fmt.Println(m)
m = make(map[string]int)
fmt.Println(m)

3、map 的遍历

我们可以使用 for 循环对 map 进行遍历操作:

m := map[string]int{
    "a": 1,
    "b": 2,
    "c": 3,
}
for key, value := range m {
    fmt.Printf("Key: %s, Value: %d\n", key, value)
}

1. 按照 key 正序排列遍历打印

下面这个操作是先将 map 中的 key 做成一个切片,然后对切片进行排序,最后再遍历切片即可。

注意:这里需要引入 sort 模块

m := map[string]int{
    "a": 1,
    "b": 3,
    "c": 2,
} keyList := make([]string, 0, len(m)) for key, _ := range m {
    keyList = append(keyList, key)
} sort.Strings(keyList) for _, key := range keyList {
    fmt.Println(key, m[key])
}

2. 按照 key 倒序排列遍历打印

同样,这里也是将 key 全部取出来,然后倒序操作:

m := map[string]int{
    "a": 1,
    "b": 3,
    "c": 2,
} keyList := make([]string, 0, len(m)) for key, _ := range m {
    keyList = append(keyList, key)
} sort.Slice(keyList, func(i, j int) bool {
    return keyList[i] > keyList[j]
}) for _, key := range keyList {
    fmt.Println(key, m[key])
}

3. 按照 value 正序排列遍历打印

对 value 进行排序,这里的做法是先定义一个结构体 struct,然后将 map 中的 key-value 赋值到这个 struct,做成一个 struct 切片,然后对结构体切片按 value 进行排序。

这里结构体的概念会在后面介绍,这里先直接使用:

m := map[string]int{
    "a": 1,
    "b": 3,
    "c": 2,
} type kv struct {
    Key   string
    Value int
} var sortedKV []kv for k, v := range m {
    sortedKV = append(sortedKV, kv{k, v})
} sort.Slice(sortedKV, func(i, j int) bool {
    return sortedKV[i].Value < sortedKV[j].Value
}) for _, kv := range sortedKV {
    fmt.Printf("%s: %d\n", kv.Key, kv.Value)
}

4. 按照 value 倒序排列遍历打印

按照 value 倒序排列的方式与按 value 正序排列的方式类似,只是需要将排序规则改为 > 即可:

m := map[string]int{
    "a": 1,
    "b": 3,
    "c": 2,
} type kv struct {
    Key   string
    Value int
} var sortedKV []kv for k, v := range m {
    sortedKV = append(sortedKV, kv{k, v})
} sort.Slice(sortedKV, func(i, j int) bool {
    return sortedKV[i].Value > sortedKV[j].Value
}) for _, kv := range sortedKV {
    fmt.Printf("%s: %d\n", kv.Key, kv.Value)
}

Golang基础笔记四之map的更多相关文章

  1. GoLang基础数据类型--->字典(map)详解

    GoLang基础数据类型--->字典(map)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   可能大家刚刚接触Golang的小伙伴都会跟我一样,这个map是干嘛的,是 ...

  2. Golang基础笔记

    <基础> Go语言中的3个关键字用于标准的错误处理流程: defer,panic,recover. 定义一个名为f 的匿名函数: Go 不支持继承和重载. Go的goroutine概念:使 ...

  3. Vue学习计划基础笔记(四) - 事件处理

    事件处理 目标: 熟练掌握事件监听的方式,熟悉事件处理方式以及各类事件修饰符 理解在html中监听事件的意义 监听事件(v-on) 类似普通的on,例如v-on:click或@click就相当于普通的 ...

  4. Python基础笔记(四)

    1. 返回函数与闭包 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure) def getSum(*args): def add(): ...

  5. Java IO学习笔记四:Socket基础

    作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...

  6. MYSQL基础笔记(四)-数据基本操作

    数据操作 新增数据:两种方案. 1.方案一,给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致.凡是非数值数据,到需要使用引号(建议使用单引号)包裹. i ...

  7. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

  8. golang学习笔记8 beego参数配置 打包linux命令

    golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...

  9. Golang 基础之基础语法梳理 (一)

    大家好,今天将梳理出的 Go语言基础语法内容,分享给大家. 请多多指教,谢谢. 本次<Go语言基础语法内容>共分为三个章节,本文为第一章节 Golang 基础之基础语法梳理 (一) Gol ...

  10. Golang基础教程

    以下使用goland的IDE演示,包含总计的golang基础功能共20个章节 一.go语言结构: 二.go基础语法: 三.变量 四.常量 五.运算符 六.条件语句 七.循环 八.函数 九.变量作用域 ...

随机推荐

  1. Arrays.asList() 详解

    [1. 要点] 该方法是将数组转化成List集合的方法. List list = Arrays.asList("a","b","c"); 注 ...

  2. MySQL-删除数据和count(*)原理

    delete删除数据原理 在InndoDB存储引擎中,delete删除操作是把需要删除的数据或者页标记为已删除,后面如果有需要,直接复用即可.这些被标记为已经删除的数据,看起来就像空洞一样.所以看起来 ...

  3. C# Socket 使用教程

    我在学习Socket时,总是感觉文章看不懂,视频又好长,所以留下这篇学习笔记,权当做同学间学习参考,与个人回顾吧. 简介 Socket(译做:管道/套接字)是一个便捷的类 用于封装通信时所涉及到复杂底 ...

  4. 如何学习SLAM(超级全面)

    如何学习SLAM(超级全面) 由于SLAM是一个错综复杂的研究领域,涉及到非常多的关键技术.这里先讲讲学习方法论,然后对一些关键性概念(包括SLAM.ROS.SLAM移动机器人)进行分析,最后给出典型 ...

  5. TMS WEB Core的DEMO

    TMS WEB Core的思路就是把你界面设计转换成js.这个打通了,将会使生产效率呈几何级数提高. 说如何让其demo的能跑起来: 1.看图.增加参数(TMSHttpConfig.exe). 2.运 ...

  6. 探秘Transformer系列之(22)--- LoRA

    探秘Transformer系列之(22)--- LoRA 目录 探秘Transformer系列之(22)--- LoRA 0x00 概述 0x01 背景知识 1.1 微调 1.2 PEFT 1.3 秩 ...

  7. sql查询语句典例整理

    简单查询: 1.SELECT * FROM 表名称 WHERE 字段名 LIKE '查询内容' 1). SELECT * FROM member WHERE NickName LIKE '贝克汉姆': ...

  8. jmeter结果断言的几种方法

    这篇文章里,我们已经知道了怎样实用json断言(https://www.cnblogs.com/becks/p/14951725.html) 接下来还有几种断言,一一介绍 一.响应断言,这种断言的逻辑 ...

  9. jmeter使用时报错问题

    一.打开时命令行提示按任意键继续图形界面无法打开 如图,打开时jmeter命令行报错 根据报错内容,是Java没有安装好. jdk安装好后,需要在环境变量中配置. 但是jdk安装配置好后打开还是报错, ...

  10. 鸿蒙原生开源库 ViewPool 在 OpenHarmony 社区正式上线

    近日,由伙伴参与共建的鸿蒙原生开源库"ViewPool"在OpenHarmony社区正式上线.这个开发库是基于OpenHarmony技术孵化的成果,充分发挥了平台的技术特性,同时融 ...