Go语言映射 | 青训营笔记

92 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天

一、本堂课重点内容

本堂课的知识要点有哪些?

  • Go语言映射

二、详细知识点介绍

本堂课介绍了哪些知识点?

Go语言映射

  1. 映射是一种数据结构,由两个字段构成,一个字段称为“键(key)”,另一个字段称为“值(value)”。键和值是一一对应的,就像一张二维表,由两列构成,左边一列为键,右边一列为值,而每一行为一个键值对(也称为项item),行数不限,可以无限扩展。

  2. Go语言规定,在一个映射里所有的键都是唯一的,而且必须是支持==和!=操作符的类型。

  3. 映射的值倒是没有这些限制,可以是任意数据类型。

  4. 映射可以由var关键字声明,但必须初始化后才可以使用。创建映射格式如下:

    格式1    var myMap map[type1]type2
    格式2    myMap := make(map[type1]type2)
    格式3    myMap := make(map[type1]type2, 200)
    格式4    myMap := map[type1]type2{key1:value1, key2:value2}
    
  5. 映射建议使用内置函数make声明并初始化。

  6. 用内置函数make创建映射不必指定map容量,系统会默认一个初始容量,随着内容的增加,会自动扩容,用户不必关注映射容量。

  7. 映射的键不可以是切片,但是它的值是可以的。

  8. Go语言中映射支持的操作:

    语法含义
    m[k]=v用键 k 来将值 v 赋给映射 m,如果 mk 已存在则覆盖原值
    delete(m,k)将键 k 及其对应的值删除,如果 k 不存在则不操作
    v:=m[k]将映射 m 中键 k 对应的值赋给 v,如果 k 不存在,则将映射类型的零值赋给 v
    v,found:=m[k]将映射 m 中键 k 对应的值赋给 v,并将 true 赋给 found;如果 k 不存在,则将映射类型的零值赋给 k,并且将 false 赋给 found
    len(m)返回映射 m 中项的数量,即键值对的数量
  9. 映射可以使用内置函数len获得键值对的数目,但不可以用cap函数来获得容量,映射的容量由系统自动确定。

  10. 映射是一组键值对的无序集合,键和值必须成对出现,且相互绑定。键和值的建立可以通过赋值来完成。赋值时,键在赋值操作符左边,定位映射项位置,而值在赋值操作符右边,等同于把值存给键,形成键值对。

  11. 映射的填入就是往现存的映射增加项,如果映射里已存在该键对应的项,则用新的值代替该项原来的值,这相当于修改原来的项;如果不存在,则直接增加一项,为新增项。

  12. Go语言提供了两种格式来查找值。

    格式1:value,ok := myMap[key],根据key来确定valueok是布尔值,true表示映射项存在,其值为valuefalse表示映射项不存在,返回的value是映射类型的零值。

    格式2:value := myMap[key],根据value是否为零值来判断键值对是否存在。

  13. 内置delete函数是专门用来删除映射项的,对数组、切片等无效。delete函数的使用格式为:delete(m,key),表示从映射m中删除键为key的项。

  14. 通过赋值的方式可以更改映射里某键对应的值,但反过来是不行的,即不能通过赋值的方式来简单地改变键。

  15. 通过delete函数可以间接实现修改键,而保持其对应的值不变,具体实现方法是保留值,删除项,以新键及保留值追加映射项。

  16. 映射的反转是指映射项的键和值对调,前提是值是唯一的,且数据类型满足==!=操作符,也就是映射支持的可作为键的数据类型。

  17. 可以按键序输出映射,具体步骤是先把键全部遍历出来赋给一个切片,然后对切片进行排序,最后按排好序的切片读取映射项输出,就是按键序输出的映射项了。

  18. 要遍历map里的所有项,和遍历数组或切片一样,使用关键字range,其格式如下:

    for key,value := range myMap{
        ...
    }
    

    遍历结果将每个映射项的键赋给key,对应的值赋给value。如果keyvalue两个参数中仅取一个,其中一个可以用_代替;如果仅声明一个变量,则仅返回key

三、引用参考

我参考了哪些外部博客/笔记/文章?