这是我参与「第五届青训营 」伴学笔记创作活动的第 8 天
一、本堂课重点内容
本堂课的知识要点有哪些?
- Go语言映射
二、详细知识点介绍
本堂课介绍了哪些知识点?
Go语言映射
-
映射是一种数据结构,由两个字段构成,一个字段称为“键(key)”,另一个字段称为“值(value)”。键和值是一一对应的,就像一张二维表,由两列构成,左边一列为键,右边一列为值,而每一行为一个键值对(也称为项item),行数不限,可以无限扩展。
-
Go语言规定,在一个映射里所有的键都是唯一的,而且必须是支持==和!=操作符的类型。
-
映射的值倒是没有这些限制,可以是任意数据类型。
-
映射可以由
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} -
映射建议使用内置函数
make声明并初始化。 -
用内置函数
make创建映射不必指定map容量,系统会默认一个初始容量,随着内容的增加,会自动扩容,用户不必关注映射容量。 -
映射的键不可以是切片,但是它的值是可以的。
-
Go语言中映射支持的操作:
语法 含义 m[k]=v用键 k来将值v赋给映射m,如果m中k已存在则覆盖原值delete(m,k)将键 k及其对应的值删除,如果k不存在则不操作v:=m[k]将映射 m中键k对应的值赋给v,如果k不存在,则将映射类型的零值赋给vv,found:=m[k]将映射 m中键k对应的值赋给v,并将true赋给found;如果k不存在,则将映射类型的零值赋给k,并且将false赋给foundlen(m)返回映射 m中项的数量,即键值对的数量 -
映射可以使用内置函数
len获得键值对的数目,但不可以用cap函数来获得容量,映射的容量由系统自动确定。 -
映射是一组键值对的无序集合,键和值必须成对出现,且相互绑定。键和值的建立可以通过赋值来完成。赋值时,键在赋值操作符左边,定位映射项位置,而值在赋值操作符右边,等同于把值存给键,形成键值对。
-
映射的填入就是往现存的映射增加项,如果映射里已存在该键对应的项,则用新的值代替该项原来的值,这相当于修改原来的项;如果不存在,则直接增加一项,为新增项。
-
Go语言提供了两种格式来查找值。
格式1:
value,ok := myMap[key],根据key来确定value,ok是布尔值,true表示映射项存在,其值为value;false表示映射项不存在,返回的value是映射类型的零值。格式2:
value := myMap[key],根据value是否为零值来判断键值对是否存在。 -
内置
delete函数是专门用来删除映射项的,对数组、切片等无效。delete函数的使用格式为:delete(m,key),表示从映射m中删除键为key的项。 -
通过赋值的方式可以更改映射里某键对应的值,但反过来是不行的,即不能通过赋值的方式来简单地改变键。
-
通过
delete函数可以间接实现修改键,而保持其对应的值不变,具体实现方法是保留值,删除项,以新键及保留值追加映射项。 -
映射的反转是指映射项的键和值对调,前提是值是唯一的,且数据类型满足
==和!=操作符,也就是映射支持的可作为键的数据类型。 -
可以按键序输出映射,具体步骤是先把键全部遍历出来赋给一个切片,然后对切片进行排序,最后按排好序的切片读取映射项输出,就是按键序输出的映射项了。
-
要遍历
map里的所有项,和遍历数组或切片一样,使用关键字range,其格式如下:for key,value := range myMap{ ... }遍历结果将每个映射项的键赋给
key,对应的值赋给value。如果key和value两个参数中仅取一个,其中一个可以用_代替;如果仅声明一个变量,则仅返回key。