7.5.1 概述

Go语言中的map(映射、字典)是一种内置的数据结构,它是一个无序的key—value对的集合,比如以身份证号作为唯一键来标识一个人的信息。

map格式为:
map[keyType]valueType

在一个map里所有的键都是唯一的,而且必须是支持==和!=操作符的类型,切片、函数以及包含切片的结构类型这些类型由于具有引用语义,不能作为映射的键,使用这些类型会造成编译错误:

  1. dict := map[ []string ]int{} //err, invalid map key type []string

map值可以是任意类型,没有限制。map里所有键的数据类型必须是相同的,值也必须如何,但键和值的数据类型可以不相同。

注意:map是无序的,我们无法决定它的返回顺序,所以,每次打印结果的顺利有可能不同。

7.5.2 创建和初始化

7.5.2.1 map的创建

  1. var m1 map[int]string //只是声明一个map,没有初始化, 此为空(nil)map
  2. fmt.Println(m1 == nil) //true
  3. //m1[1] = "mike" //err, panic: assignment to entry in nil map
  4. //m2, m3的创建方法是等价的
  5. m2 := map[int]string{}
  6. m3 := make(map[int]string)
  7. fmt.Println(m2, m3) //map[] map[]
  8. m4 := make(map[int]string, 10) //第2个参数指定容量
  9. fmt.Println(m4) //map[]

7.5.2.2 初始化

  1. //1、定义同时初始化
  2. var m1 map[int]string = map[int]string{1: "mike", 2: "yoyo"}
  3. fmt.Println(m1) //map[1:mike 2:yoyo]
  4. //2、自动推导类型 :=
  5. m2 := map[int]string{1: "mike", 2: "yoyo"}
  6. fmt.Println(m2)

7.5.3 常用操作

7.5.3.1 赋值

  1. m1 := map[int]string{1: "mike", 2: "yoyo"}
  2. m1[1] = "xxx" //修改
  3. m1[3] = "lily" //追加, go底层会自动为map分配空间
  4. fmt.Println(m1) //map[1:xxx 2:yoyo 3:lily]
  5. m2 := make(map[int]string, 10) //创建map
  6. m2[0] = "aaa"
  7. m2[1] = "bbb"
  8. fmt.Println(m2) //map[0:aaa 1:bbb]
  9. fmt.Println(m2[0], m2[1]) //aaa bbb

7.5.3.2 遍历

  1. m1 := map[int]string{1: "mike", 2: "yoyo"}
  2. //迭代遍历1,第一个返回值是key,第二个返回值是value
  3. for k, v := range m1 {
  4. fmt.Printf("%d ----> %s\n", k, v)
  5. //1 ----> mike
  6. //2 ----> yoyo
  7. }
  8. //迭代遍历2,第一个返回值是key,第二个返回值是value(可省略)
  9. for k := range m1 {
  10. fmt.Printf("%d ----> %s\n", k, m1[k])
  11. //1 ----> mike
  12. //2 ----> yoyo
  13. }
  14. //判断某个key所对应的value是否存在, 第一个返回值是value(如果存在的话)
  15. value, ok := m1[1]
  16. fmt.Println("value = ", value, ", ok = ", ok) //value = mike , ok = true
  17. value2, ok2 := m1[3]
  18. fmt.Println("value2 = ", value2, ", ok2 = ", ok2) //value2 = , ok2 = false

7.5.3.3 删除

  1. m1 := map[int]string{1: "mike", 2: "yoyo", 3: "lily"}
  2. //迭代遍历1,第一个返回值是key,第二个返回值是value
  3. for k, v := range m1 {
  4. fmt.Printf("%d ----> %s\n", k, v)
  5. //1 ----> mike
  6. //2 ----> yoyo
  7. //3 ----> lily
  8. }
  9. delete(m1, 2) //删除key值为3的map
  10. for k, v := range m1 {
  11. fmt.Printf("%d ----> %s\n", k, v)
  12. //1 ----> mike
  13. //3 ----> lily
  14. }

7.5.4 map做函数参数

在函数间传递映射并不会制造出该映射的一个副本,不是值传递,而是引用传递:

  1. func DeleteMap(m map[int]string, key int) {
  2. delete(m, key) //删除key值为3的map
  3. for k, v := range m {
  4. fmt.Printf("len(m)=%d, %d ----> %s\n", len(m), k, v)
  5. //len(m)=2, 1 ----> mike
  6. //len(m)=2, 3 ----> lily
  7. }
  8. }
  9. func main() {
  10. m := map[int]string{1: "mike", 2: "yoyo", 3: "lily"}
  11. DeleteMap(m, 2) //删除key值为3的map
  12. for k, v := range m {
  13. fmt.Printf("len(m)=%d, %d ----> %s\n", len(m), k, v)
  14. //len(m)=2, 1 ----> mike
  15. //len(m)=2, 3 ----> lily
  16. }
  17. }
作者:admin  创建时间:2018-06-18 05:37
 更新时间:2018-06-18 05:42
上一篇:
下一篇: