Go 语言程序设计——集合类型(3)

映射

  • 映射(map)是一种内置的数据结构,保存键-值对的无序集合,它的容量只受到机器内存的限制
  • 映射中所有的键都是唯一的而且必须支持 ==!= 操作符的类型
  • 大部分 Go 语言的基础类型都可以作为映射的键,例如 intfloat64runestring可比较的数组和结构体基于这些类型的自定义类型指针
  • 指针引用类型 或者 任何内置类型的值自定义类型 都可以做值,包括了 映射 本身,所以它可以创建任何复杂的数据结构
  • 映射的操作:


    映射的操作
  • 映射是属于引用类型,所以不管一个映射保存了多少的数据,传递都是很廉价的
  • 映射里所有键的数据类型必须是相同的,值也必须如此,但键和值的数据类型可以不同
  • 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) 

插入和更新一个项的语法是完全一样的,如果没有值,则设置为新的值

键序遍历映射

思想为创建一个切片去保存映射里所有的键,然后对这个键的切片排序,遍历后得到键,再从映射里得到键的值。

映射反转

  • 如果一个映射的值是唯一的,并且值的类型也是映射所支持的键类型的话,我们就能将它反转
  • 如果值不是唯一的,实质上只有最后一个不唯一的值对应的键被保存