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
映射传递给函数成本很小,并且不会复制底层的数据结构。