package ch4
/**
映射的内部实现和基础功能
映射是一个存储键值对的无序集合,实现使用了散列表。
*/
func main() {
/*
创建和初始化
映射的键可以是任何值,只要这个值可以使用==运算符做比较。
切片、函数以及包含切片的结构类型这些类型由于具有引用语义,
不能作为映射的键。
*/
// 使用make声明映射
// 创建一个映射,键的类型是string,值的类型是int
dict := make(map[string]int)
// 创建一个映射,键和值的类型都是string
// 使用两个键值对初始化映射
dict := map[string]string{"red": "#da1337", "orange": "#e95a22"}
// 使用映射字面量声明空映射
// 创建一个映射,使用字符串切片作为映射的键
// []string是切片,不能作为映射的键,所以报错
dict := map[[]string]int{}
// 使用字符串切片作为值
dict := map[int] []string{}
/**
使用映射
*/
// 为映射赋值
// 创建一个空映射,用来存储颜色以及颜色对应的十六进制代码
colors := map[string] string{}
// 将red的代码加入到映射
colors["red"] = "#da1337"
// 对nil映射赋值时会报错
// 通过声明映射创建一个nil映射
var colors map[string] string
// 将red的代码加入到映射,报错
colors["red"] = "#da1377"
// 从映射获取值并判断键是否存在
// 获取blue对应的值
value, exists := colors["blue"]
if exists {
fmt.Println(value)
}
// 从映射获取值,并通过该值判断键是否存在
value := colors["blue"]
// 通过判断这个值是不是零值
if value != "" {
fmt.Println(value)
}
// 使用range迭代映射
// 创建一个映射,存储颜色和十六进制代码
colors := map[string] string{
"red": "#da1337",
"orange": "#e95a22",
"darkgray": "#a9a9a9",
}
// 显示映射里的所有颜色
for key, value := range colors {
fmt.Printf("key: %s value: %s\n", key, value)
}
// 从映射中删除一项
// 这种方法只能用在映射存储的值都是非零值的情况
delete(colors, "red")
/**
在函数间传递映射
在函数间传递映射并不会制造出该映射的一个副本。
实际上,当传递映射给一个函数,并对这个映射做了修改时,
所有对这个映射的引用都会察觉到这个修改。
*/
// 删除orange后,是直接对原来的映射进行操作的。
delete(colors,"orange")
}