映射
- 映射(map)是一种内置的数据结构,保存键-值对的无序集合,它的容量只受到机器内存的限制
- 映射中所有的键都是唯一的而且必须支持
==
和!=
操作符的类型 - 大部分 Go 语言的基础类型都可以作为映射的键,例如
int
、float64
、rune
、string
、可比较的数组和结构体
、基于这些类型的自定义类型
、指针
-
指针
、引用类型
或者任何内置类型的值
、自定义类型
都可以做值,包括了映射
本身,所以它可以创建任何复杂的数据结构 -
映射的操作:
映射的操作 - 映射是属于引用类型,所以不管一个映射保存了多少的数据,传递都是很廉价的
- 映射里所有键的数据类型必须是相同的,值也必须如此,但键和值的数据类型可以不同
-
make()
函数可以创建切片、映射和通道,用make()
来创建一个映射时,得到的是一个空映射
创建和填充映射
- 对于一些小映射,我们没必要考虑是否指定初始容量,如果映射比较大,指定恰当的容量可以提高性能
- 映射和数组、切片一样可以使用
[]
索引操作符,当不同的是,映射不必是int
类型,可以为其他类型 - 映射里面的项是无序的,所以可能打印出来的顺序和本书的不一样
映射查询
- 两种方法用于映射查询,两种方式都是使用
[]
操作符 - 第一种方式直接查询,如果这个键并没有在映射里,就会返回一个
0
值(如果本身就存的0
,就不知道是不是不存在) - 第二种方式可以指定两个返回值,第一个用来获得键对应的值,第二个变量是布尔类型(键存在则为
true
, 否则则为false
)
修改映射
我们可以往映射里插入、删除、修改一项:
fmt.Println(len(populationForCity), populationForCity)
delete(populationForCity, "Shanghai") // 删除
fmt.Println(len(populationForCity), populationForCity)
populationForCity["Karachi"] = 11620000 // 更新
fmt.Println(len(populationForCity), populationForCity)
populationForCity["Beijing"] = 11290000 // 插入
fmt.Println(len(populationForCity), populationForCity)
插入和更新一个项的语法是完全一样的,如果没有值,则设置为新的值
键序遍历映射
思想为创建一个切片去保存映射里所有的键,然后对这个键的切片排序,遍历后得到键,再从映射里得到键的值。
映射反转
- 如果一个映射的值是唯一的,并且值的类型也是映射所支持的键类型的话,我们就能将它反转
- 如果值不是唯一的,实质上只有最后一个不唯一的值对应的键被保存