05.go map详细介绍

映射是一个集合,可以使用类似处理数组和切片的方式迭代映射中的元素。但映射是无序的集合,意味着没有办法预测键值对被返回的顺序。即便使用同样的顺序保存键值对,每次迭代映射的时候顺序也可能不一样。

创建map

package main

import "log"

func main() {
    // 创建一个映射,键的类型是 string,值的类型是 int
    dict := make(map[string]int)
    log.Println(dict)

    // 创建一个映射,键和值的类型都是 string
    // 使用两个键值对初始化映射
    dict2 := map[string]string{"Red": "#da1337", "Orange": "#e95a22"}
    log.Println(dict2)

    // 创建一个空映射,用来存储颜色以及颜色对应的十六进制代码
    colors := map[string]string{}
    // 将 Red 的代码加入到映射
    colors["Red"] = "#da1337"
    log.Println(colors)
}

控制台:

2018/02/07 17:37:28 map[]

2018/02/07 17:37:32 map[Red:#da1337 Orange:#e95a22]

2018/02/07 17:37:40 map[Red:#da1337]

从映射获取值,并通过该值判断键是否存在获取键 Blue 对应的值

    var colors map[string]string


    value := colors["Blue"]
    // 这个键存在吗?
    if value != "" {
        log.Println(value)
    }

使用 range 迭代映射

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

从映射中删除一项

// 删除键为 Coral 的键值对
    delete(colors2, "Coral")
    // 显示映射里的所有颜色
    for key, value := range colors2 {
        log.Printf("Key: %s Value: %s\n", key, value)
    }

在函数间传递映射

在函数间传递映射并不会制造出该映射的一个副本。实际上,当传递映射给一个函数,并对这个映射做了修改时,所有对这个映射的引用都会察觉到这个修改,这个特性和切片类似,保证可以用很小的成本来复制映射

func main() {
// 创建一个映射,存储颜色以及颜色对应的十六进制代码
colors := map[string]string{
"AliceBlue": "#f0f8ff",
"Coral": "#ff7F50",
"DarkGray": "#a9a9a9",
"ForestGreen": "#228b22",
}
// 显示映射里的所有颜色
for key, value := range colors {
fmt.Printf("Key: %s Value: %s\n", key, value)
}
// 调用函数来移除指定的键
removeColor(colors, "Coral")
// 显示映射里的所有颜色
for key, value := range colors {
fmt.Printf("Key: %s Value: %s\n", key, value)
}
}
// removeColor 将指定映射里的键删除
func removeColor(colors map[string]string, key string) {
delete(colors, key)
}

Key: AliceBlue Value: #F0F8FF

Key: Coral Value: #FF7F50

Key: DarkGray Value: #A9A9A9

Key: ForestGreen Value: #228B22

Key: AliceBlue Value: #F0F8FF

Key: DarkGray Value: #A9A9A9

Key: ForestGreen Value: #228B22

映射传递给函数成本很小,并且不会复制底层的数据结构。