简介

Map 是一种 无序键值对集合
可以对其进行迭代,由于是无序的集合,所以遍历时的顺序无法保证。

Map的定义

    // 方法一:使用Map关键字来定义
    var mapDefinedOne map[int]string

    // 方法二:直接初始化
    mapDefinedTwo := map[int]string{0:"zero", 1:"one", 2:"two"}

    // 方法三: 使用make定义
    mapDefinedThree := make(map[int]string)

    // 方法四:使用make定义一个容量为5的map, 初始化容量为5,不代表你只可以放5个元素
    mapDefinedFour := make(map[int]string, 5)

Map的赋值

方法一:

我们不能直接使用 mapDefinedOne,直接使用会引发panic: assignment to entry in nil map,所以需要初始化

    // 定义
    var mapDefinedOne map[int]string
    // 初始化
    mapDefinedOne = make(map[int]string)
    // 赋值
    mapDefinedOne[0] = "第一个元素"
    // 打印
    fmt.Println(mapDefinedOne)

输出结果:
image.png

方法二:

    // 定义
    mapDefinedTwo := map[int]string{0:"zero", 1:"one", 2:"two"}
    // 也可以继续向map中添加元素
    mapDefinedTwo[3] = "three"
    // 打印
    fmt.Println(mapDefinedTwo)

image.png

方法三:

    // 使用make定义
    mapDefinedThree := make(map[int]string)
    // 可以直接赋值
    mapDefinedThree[0] = "zero"
    // 打印
    fmt.Println(mapDefinedThree)

image.png

方法四:

    // 使用make定义
    mapDefinedFour := make(map[int]string, 5)
    // 可以直接赋值,虽然我们指定了5个容量, 但是元素数量可以大于5
    mapDefinedFour[0] = "zero"
    mapDefinedFour[1] = "one"
    mapDefinedFour[2] = "two"
    mapDefinedFour[3] = "three"
    mapDefinedFour[4] = "four"
    mapDefinedFour[5] = "five"
    // 打印
    fmt.Println(mapDefinedFour)

image.png

Map值的使用

这里使用第四种方式来做演示

    // 使用make定义
    mapDefinedFour := make(map[int]string, 5)
    // 可以直接赋值
    mapDefinedFour[5] = "five"
    // 打印
    fmt.Println(mapDefinedFour[5])

image.png

Map值的更新

    // 使用make定义
    mapDefinedFour := make(map[int]string, 5)
    // 可以直接赋值
    mapDefinedFour[5] = "five"
    mapDefinedFour[5] = "fiveUpdate"
    // 打印
    fmt.Println(mapDefinedFour[5])

image.png

对元素进行删除,使用内置delete删除元素

  • delete

    delete(map, 键)
  • 删除示例:

      // 使用make定义
      mapDefinedFour := make(map[int]string, 5)
      // 可以直接赋值
      mapDefinedFour[5] = "five"
      mapDefinedFour[6] = "fiveUpdate"
      // 打印
      fmt.Println("删除之前的map:", mapDefinedFour)
      fmt.Println("删除之前的map的键值:", mapDefinedFour[5])
    
      delete(mapDefinedFour, 5)
    
      fmt.Println("删除之后的map:", mapDefinedFour)
      fmt.Printf("删除之后的map的键值:%s", mapDefinedFour[5])

    image.png

  • 对一个nil map删除元素

      // 使用make定义
      var mapDefinedOne map[int]string
      // 也是能删除的, 不会引发panic
      if mapDefinedOne == nil {
          delete(mapDefinedOne, 2)
          fmt.Println("Nil")
      }

    image.png

  • 删除一个map中不存在的元素

      // 使用make定义
      var mapDefinedOne map[int]string
      mapDefinedOne = make(map[int]string)
      mapDefinedOne[2] = "two"
    
      fmt.Println("mapDefinedOne的值:", mapDefinedOne)
    
      // 删除一个不存在的元素
      delete(mapDefinedOne, 1)
    
      fmt.Println("删除之后mapDefinedOne的值:", mapDefinedOne)

清空一个map

    // 使用make定义
    var mapDefinedOne map[int]string
    mapDefinedOne = make(map[int]string)
    mapDefinedOne[2] = "two"
    mapDefinedOne[1] = "one"

    fmt.Println("mapDefinedOne的值:", mapDefinedOne)

    // 对map重新初始化达到清空的目的
    mapDefinedOne = make(map[int]string)
    fmt.Println("清空之后mapDefinedOne的值:", mapDefinedOne)

image.png

获取map的长度, 显示为map的元素的个数

  • 场景一

      // 使用make定义
      var mapDefinedOne map[int]string
      mapDefinedOne = map[int]string{0: "zero", 1: "one", 2: "two"}
      
      fmt.Println("mapDefinedOne的长度:", len(mapDefinedOne))

    image.png

  • 场景二

      // 使用make定义
      var mapDefinedOne map[int]string
      mapDefinedOne = map[int]string{}
    
      fmt.Println("mapDefinedOne的长度:", len(mapDefinedOne))

    image.png

  • 场景三

      // 使用make定义
      var mapDefinedOne map[int]string
      mapDefinedOne = make(map[int]string)
    
      fmt.Println("mapDefinedOne的长度:", len(mapDefinedOne))

    image.png

  • 场景四

      // 使用make定义
      mapDefinedOne := make(map[int]string, 5)
    
      fmt.Println("mapDefinedOne的长度:", len(mapDefinedOne))

    image.png

map的遍历

    // 使用make定义
    mapDefinedFour := make(map[int]string, 5)

    mapDefinedFour[0] = "zero"
    mapDefinedFour[1] = "one"
    mapDefinedFour[2] = "two"
    mapDefinedFour[3] = "three"
    mapDefinedFour[4] = "four"
    mapDefinedFour[5] = "five"

    fmt.Println("mapDefinedOne的长度:", len(mapDefinedFour))

    // map的遍历
    for key, value := range mapDefinedFour {
        fmt.Println(" key:", key, "value:", value)
    }

image.png
从结果上来看, map的遍历结果是无序的, 明显和我们写入的顺序是不一致的;

判断一个key是否存在

  mapExample := make(map[string]string, 1)

  mapExample["key"] = "value"

  key := "key2"

  // 检查一个key是否存在
  value, exist := mapExample[key]
  if !exist {
      fmt.Println("键: [", key, "]不存在:")
  }

  key = "key"
  value, exist = mapExample[key]
  if exist {
      fmt.Println("键: [", key, "]存在; 值: [", value, "]")
  }

image.png


Architecture
0 声望0 粉丝

知其然, 更要知其所以然~