映射 map ,又称为希哈表,是一种数据结构,用于存储一系列无序的键值对。映射里基于键来存储值。映射功能强大的地方是,能够基于键快速检索数据。键就像索引一样,指向与该键关联的值。

声明和初始化

Go 语言中有很多种方法可以创建并初始化映射,可以使用内置的 make 函数,也可以使用映射字面量。

  1. // 创建一个映射,键的类型是 string,值的类型是 int
  2. dict := make(map[string]int)
  3. // 创建一个映射,键和值的类型都是 string
  4. // 使用两个键值对初始化映射
  5. dict := map[string]string{"Red": "#da1337", "Orange": "#e95a22"}

创建映射时,更常用的方法是使用映射字面量。映射的初始长度会根据初始化时指定的键值对的数量来确定。

使用 map

我们已经见过可以使用 val = dict[key] 的方法获取 key 对应的值 val 。如果 dict 中不存在 keyval 就是一个值类型的空值。可使用下面方法判断 map 中是否存在键 key:

  1. _, ok := dict[key] // 如果 key 存在则 ok 为 true,否则为 false

要想从映射 dict 中删除 key ,可以直接 delete(dict, key) 就可以。但是如果 key 不存在,该操作不会产生错误。

迭代映射

迭代映射里的所有值和迭代数组或切片一样,使用关键字 range,但对映射来说,range 返回的不是索引和值,而是键值对。

  1. // 创建一个映射,存储颜色以及颜色对应的十六进制代码
  2. colors := map[string]string{
  3. "AliceBlue": "#f0f8ff",
  4. "Coral": "#ff7F50",
  5. "DarkGray": "#a9a9a9",
  6. "ForestGreen": "#228b22",
  7. }
  8. // 显示映射里的所有颜色
  9. for key, value := range colors {
  10. fmt.Printf("Key: %s Value: %s\n", key, value)
  11. }

注意 map 的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。如果要按顺序遍 key/value 对,我们必须显式地对 key 进行排序。