Go的Map学习笔记 | 青训营笔记

142 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记。

一、认识Map(定义、创建、查看、获取Map的长度)

可以看作是HashMap

map是Go中的内置类型,它将一个值与一个键关联起来。可以使用相应的键检索值。

Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值 Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的,也是引用类型

注意点

1、map是无序的,每次打印出来的map都会不一样,它不能通过index获取,而必须通过key获取

2、map的长度是不固定的,也就是和slice一样,也是一种引用类型

3、内置的len函数同样适用于map,返回map拥有的key的数量

4、map的key可以是所有可比较的类型,如布尔型、整数型、浮点型、复杂型、字符串型……也可以键。

定义、创建、查看、获取Map的长度

import (
   "fmt"
   "testing"
)
​
func Test_08_01(t *testing.T) {
   //1、定义Map
   var countryCapitalMap map[string]string   //默认定义类型为nil,相当于null
   //创建集合:必须要进行创建才能够添加key、value键值对
   countryCapitalMap = make(map[string]string)
   countryCapitalMap["France"] = "Paris"
   countryCapitalMap["Italy"] = "Rome"
   countryCapitalMap["Japan"] = "Tokyo"
   countryCapitalMap["India"] = "New Delhi"
​
   //2、使用key来输出map
   for key, value := range countryCapitalMap {
      fmt.Println("key:",key,",values:",value)
   }
​
   //3、查看map中是否存在元素
   captial, exists := countryCapitalMap["France"]  //这里返回两个值,前者是对应取到的value;后者为true或false,表示是否取到
   if !exists {
      //若是不存在
      fmt.Println("United States is not a city")
   }
   //若是存在
   fmt.Println(captial) // Paris
​
   //4、获取map的长度
   fmt.Println("map的长度:", len(countryCapitalMap))  //map的长度: 4
}

image-20220423213951461

二、map的删除

delete(map, key) :函数用于删除集合的元素, 参数为 map 和其对应的 key。删除函数不返回任何值。

/**
   二、map删除:delete(map, key)
 */
func Test_08_02(t *testing.T) {
   var myMap map[string]string = make(map[string]string)
   myMap["a"] = "a"
   myMap["b"] = "b"
   myMap["c"] = "c"
   fmt.Println(myMap)   //map[a:a b:b c:c]
   //删除key为a的map,没有返回值
   delete(myMap, "a")
   fmt.Println(myMap)   //map[b:b c:c]
}

三、ok-idiom

语法格式:value, ok := map[key],前者是获取到的value,后者表示是否获取到。

/**
   三、ok-idiom:通过取key,来获取到value以及是否取到
*/
func Test_08_03(t *testing.T) {
   m := make(map[string]string)
   m["a"] = "a"
   result,ok := m["a"]
   fmt.Println(result)  //a
   fmt.Println(ok)      //true
}

四、map是引用类型

/**
    四、Map引用类型:引用赋值给其他引用,对赋值后的引用修改实际上也会修改源map
*/
func Test_08_04(t *testing.T) {
    myMap := make(map[string]string)
    myMap["a"] = "a"
    myMap["b"] = "b"
    myMap["c"] = "c"//进行引用
    myMap2 := myMap
    myMap2["a"] = "aaa"
    fmt.Println(myMap2)  //map[a:aaa b:b c:c]
    fmt.Println(myMap)   //map[a:aaa b:b c:c]
    
    //可以来进行判断是否为null
    var myMap3 map[string]string
    if myMap3 == nil {
        fmt.Println("666")
    }
    //666
}

注意:map不能使用==操作符进行比较。==只能用来检查map是否为空。否则会报错:invalid operation: map1 == map2 (map can only be comparedto nil)。