Golang基础笔记四之map

本文首发于公众号: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]in