00:00
好,各位同学,那现在开始讲我们go语言核心编程的第九一章map。那map呢,其实在这个构里源构源里面,它其实就是一个什么呀,它其实是一个数据结构。那么官方呢,管它把它叫映射,实际上呢,它本质就是一个集合,来我们来看一下map的一个基本介绍。Map是k value的一个数据结构,又称为字段或者关联数组,OK,类似于其他编程语言的结合,大家有学过其他编程语言就知道,有一种有一种这个呃,数据结构呢,叫集合,对吧?他通过一个K,就是他通过这个K呢,可以找到对应的value。这个呢,在编程中是经常使用到的,所以说map呢,呃,其实它就是KY6的一个数据结构,通过K可以找到值,这是一种啊,比用在实际开发中用的比较多的,你比如说。
01:01
我去,呃,保留一个学生信息,或者存储一个学生信息,那么K呢,我用学生的编号做K,那么Y呢,我可以用学生的名字做value,诶这样呢,就可以非常方便的把学生的信息管理起来。OK,好老规矩,一边讲呢,咱一边还是做笔记啊,一边讲一边做笔记。好,打开我们的这块,把笔记打开。好,同样把笔记打开,我们一边讲一边做笔记。好,我们定一下位。找到我们心的这么一个位置。我们新建一个章节,叫map。好吧,Map。OK,给他一个标题,那么这个时候标题呢,咱们给他一个标题一。标题一,OK好,第九章我们做了一个map的基本介绍,Map的基本介绍OK。
02:04
好,给他一个标题二就是我们做map的一个基本介绍,那map的基本介绍呢,刚才老师已经做了一个说明,对吧?诶,OK,放这就行。板书一下,那下面呢,我们就来看一下map它的一些声明是怎么做的,首先我们先来看一下map的基本语法,Map基本语法是这样子的,它前面呢也是一个关键词叫VR,然后呢,这边是map的变量名称。后边这个map,注意听这个map是一个关键字。就说你这个map是固定的。这个map是固定的,这个呢,里面写上K的就是map,不是KY6的结构吗?那么这块写上K,它的数据类型是什么?后面这个写上。这个值的数据类型是什么?所以说它非常简单哈,就这么一个基本语法,就这样子的,那这里呢,我们来阐述一下第一个K。
03:06
就是这个k type可以是什么类型,在go中的map呢?它的K可以有多种数据类型,比如说布尔数字缀,指针穿穿呢,就是我们所说的管道,还可以是什么呢?只包含前面。前面类型的接口就说包括前面就是包括布尔啊,数字啊,时针啊,指针啊,或者是China的接口,结构体和数组也可以做K,但是大家想一想啊,如果用这几个做K,其实非常的奇怪,很少有人用接口或者结构体或者数组去做K,通常情况下这个K是什么类型,告诉大家,通常是。Int类型或者是实寸类型,就90%,99%都是用int或者是十寸作为K的数据类型,明白吧,OK,嗯,还有一点呢,就是slash map,还有function是绝对不可以做K。
04:07
这种数据类型的知道吧,就说你不可以把flash和map或者function做一个K,就这意思,为什么呢?因为官方的解释就是说。没办法用等号来判断。言外之意就是说将来这个。这个k value6呢,主要是用来做判断,就是你有没有存在这个K,明白这意思吧,所以大家记住两个原则,第一个呢,就是K,它可以的数据类型其实挺多的,像布尔数字,十寸字串穿了都可以,或者是这几个这几个类型也可以,但是呢。用的最多的就是int和尊。这几种数据类型是绝对不可以做K的啊,把这个稍微有一个印象就可以好了,那么我这里把它板述一下map的声明。OK,来给他一个标题二。那具体来说map的声明呢,老师刚才做了这么一个介绍,对不对?首先它的基本语法。
05:02
还有就是它的K是什么类型,我也这做了说明,它的基本语法。我们给他一个标题三。给他一个标题三基本语法好,第一个是他的这个基本语法,第二个呢是K是什么类型,这块我也给他板述一下。可以了,好大家看清楚啊,它可以的数据类型,但是。重点记这句话。通常来说这个K呢,K的数据类型啊,K是什么呢?为int或者是寸啊寸好,这是K的类型,那下面呢,肯定要给大家探讨一下value。它有,它可以是什么数据类型来看下一个幻灯片。那么在这个value type呢,它可以设的数据类型是跟K基本上是一样的,这里我们就不赘述了,通常来说各位同学通常来说这个值。是什么类型呢?是数字。
06:01
比如说整数或者浮点数还可以是string类型。就十寸类型,做这个value的类型也是非常多的,比如说我要保留学生的名字,还有什么呢?Map,也就是说他这个map里面。这个map的值还可以是另外一个map,那这样呢就构成了多重map,是这意思吧,这个用的也比较多,还可以用的,用的比较多的是structure,就是这个值呢,是一个结构体。这个结构体呢,我们后面马上就会讲到,就是就是说这个值。Map这个值的数据类型通常为数字、字符串map和结构体,大家有一个印象,好吧,我把这个呢也给同学们放到笔记里面去。没问题吧?好,下边呢,我们就来看一个麦声明的案例了。我们来看一个麦普声明。案例,好的,我给他一个标题三,我们来看看麦普声明是怎么做的。
07:03
来看一下map的声明呢,刚才已经讲过了,就是它的基本语法,就是VR后面有个变量,然后map,然后是。K的类型和值的类型,你看,比如说这我声明了一个迈普变量,名叫A。然后呢,是它的值,呃,它的K是十寸,它的这个值是十,呃,也是十寸,再看这下面这个。再看这个。同学们看到这儿也是一个map的名称,它的K是寸,它的值是int。再看下一个也是A,它的K是int类型,它的值是十寸,还有这个看看到没有,这呢有一个map,它的K是十寸类型,它的值又是一个map,这个map里面的K是什么呢?是十寸,值是十寸,也就是说是迈普,它其实可以有多重脉谱。
08:03
OK,那这里呢,我强调一点,Map它是不会,就说你声明一个map是不会分配内存的。他没没办法用,因此呢,初始化需要make。分配内存过后才能复制和使用,这点特别的重要,注意啊,这点我要强调。就说麦普声明过后跟宿主不一样,宿主声明的声明完了过后,其实它的内存空间就已经给你分配好了是不是?但是麦呢,它声明完了后是不会分配内存的,需要make,然后才可以去赋值和使用,这点请大家一定要注意,好的,我把这块呢拿过来,然后呢,我们举个例子给大家说一下map的声明来吧。打开。这个位置map声明的举例。OK,嗯,那么我们来看一个案例吧,案例说明。
09:00
我们叫做案例演示。好吧,案例演示一个。好,那打开我们的Vs code,我们新建一个文件夹。叫CHAPTER09。Chapter chapter09。OK。那这个人是专门讲map的。好,我新建一个文件夹叫map DEMO。零一。好,这里面我们先写一个文件,叫命点go。没问题吧,好,没点够,然后呢,我们老规矩来打一个包包,Package me。OK,然后呢,我们这里有个import。For ma好,写完,然后写一个主函数。Main函数。在这里面,我们来演示一下麦普的声明。声明和注意事项。那那我们现在来声明一个map,最简单的map,好吧,Map a,然后呢,诶这样不行啊,VR a map然后。
10:07
十寸同学们看到这个就是生命的一个map,那你生命完一个map过后呢,我们先来看一看,你还没有去make的时候,你在使用会出现一个什么情况,大家看到我输一个A,这个时候我们直接输出这个A,我们看看它输出什么信息。CD到我们的CHAPTER09。OK,然后呢,CD到我们刚才写的这一个map里面去,Go wrong命点go跑起来,我们可以看到输出呢,是一个空的,大家看到。你因为你没有做make,所以说它是一个空的,看什么都没有,而且这个时候你给他赋值,他会报错看,诶假设你想这么给个东西说,诶这个map呢,我给他一个K叫叫NUMBER1。这个值呢,因为是字符串嘛,这个就是K。
11:02
K的类型是尺寸,我没有写错。然后他的值呢,也是一个十寸,我给他一个值,比如说叫做宋江好同学们可以看到我这样用会有问题吗?大家想一想。我先问大家一个问题。此时此刻这个map a有没有,有没有给他分配空间。刚才讲过,如果你生命一个map,其实这个A呢,目前没有数据空间,但是你却直接给它赋值了。同学们告诉大家,这个地方一定会报错,来,我们看看会报什么错误,跑起来运,我们可以看到这里报了一个panicle。恐慌。他告诉我们assignment to。In ne map,也就是说你给一个空map赋值了,那就报错了,因为你还没有数据空间,你没有数据空间,你给他赋制必然报错,就好像有一个人他去。他去租一个房子,但是这个房子都不存在。
12:03
他直接能住进去吗?没有房子你怎么能住的进去呢?所以说这就报错了,那怎么样才能使用呢?同学们要这样子。声明就是说在使用麦前。需要先make。先make。这个make的作用是干什么呢?Make的作用make的作用就是给map分配数据空间。OK,这点其他就是给他分配数据空间,这一点跟我们数组不一样,数组其实你声明完了过后空间也就分配了,但是map呢,声明完了过后空间并没有分配。并没有分配,OK,那我怎么make make一下呢?非常的简单,A等于make,注意make的写法是这样子的,我们前面第一个参数要写上map的数据类型,也就是说。
13:06
要写这个东西。要把他的数据类型写进去,然后后面写上你给他make多大的一个空间。比如说十。这个时代表我给他分配了十个这样的空间,十个十个这样的空间,就说它可以放十对k value,明白吗?就最大可以放十个这样的空间,当然它还可以动态变化,后面我们再说好了,这个时候我们再来一执行,我们可以看到效果就完全不一样了,跑起来了。同学们可以看到,此时此刻。诶。Map。里面有个NUMBER1,这次他的K宋江也起来了。看到没有,那当然有些同学说老师,如果我再给他一个呢,可以看一下。如果我再给他一个NUMBER2,给他来一个无用。
14:00
无用,OK,同学们可以看到,因为我我现在给他第二个的话,同学们可以看,在map里面其实应该就有两对,看到没有,这是一对。这是一对KY6,这又是一对KY6,我再给大家演示一下。同学们再来,如果我又给了一个NUMBER1,然后这地方呢,我写的是武松,请同学们思考。请同学们思考,这已经有个NUMBER1了,你要给他一个NUMBER1,那么在map里面它会怎么处理呢?他会报错呢?还是说它会覆盖呢?还是说他就直接追加一个呢?来,朋友们,请看到一个特点跑起来。我们可以看到此时此刻,诶,同学们有没有发现?NUMBER2是无用,但NUMBER1变无松了,那也就是说在这地方我们可以看到一个特点,K能不能重复。K能不能重复,既然人家叫K,那K就不能重,K是什么?K是关键词的意思,那也就是说我们这个这个在这里面呢,这个K是不可以重复的,就说你有个NUMBER1,你再给个NUMBER1,他就把前面这个NUMBER1给怎么样覆盖掉了。
15:15
覆盖掉了,那么值可不可以重复呢?值可不可以重复?比如说我再来写个。NUMBER3。我还叫吴用。这个可不可以?就值,可不可以重复,大家猜一猜。就说看NUMBER2叫无用,NUMBER3还叫无用,这个允不允许,会不会覆盖这个呢。显然。这两个无用肯定是不会冲突的,因为他的K不一样就没问题。好,同学们,我们来跑一个。请看。你们可以看到。同学们可以看到在这里呢,有个NUMBER1叫武松,NUMBER3叫吴用,还有NUMBER2也是无用,看到没有?而且大家有没有发现,在我们每次运行的时候,这个K实际上它是一个无序的,看到没有。
16:08
你看这个地方我们再跑一个啊。你看同学们,看你们有没有发现我这次输出是NUMBER1武松牌,前面NUMBER3NUMBER2,这边又是NUMBER3NUMBER1NUMBER2,我们又得出一个重要的结论,后面我们还会总还会小结啊,大家不用着急,就说你没有发现这个这个map,它并没有像我们想象的那样。就是是个有序的map,它其实是是一个无序的k value,一个结构,这点请大家注意。很多很多是很多编程语言里面这个map啊,它是有序的,什么有序呢?它根要么就是根据你这个K来排序,要么就是根据你添加的顺序排序,但是我们发现go浪里边的map其实是完全没顺序的,它既不按照K来排序,也不按照你添加的顺序排序。
17:04
看到没有,所以说这块呢,大家一定要小心,如果后面你要用,你要排序,我们还可以讲排序的方法,注意听这个地方啊好,从这个地方我们就把这一个声明这块说完了,说完了好,我们先把这段代码呢给大家板述一下。然后针对这段代码呢,我们做一些相应的说明。案例演示。完了啊好,现在呢,我们对上面这个案例做一些相应的说明。对。上面代码的一个说明,OK,那么我总结这么几点,总结这么几几点,注意听讲第一点。第一点,我们可以发现map。麦普。在使用前一定要make。没什么可说的了吧。第二点,我们发现麦普的这个K。
18:02
Map的这个这个。诶,麦的这个。的K。是不能够,不能重复的。重复,如果你重新,如果重复了,重复了则以最后,以最后。最后这个k value为准,你比如说刚才我们这个武松NUMBER1,这是原先是宋江,那这又写个NUMBER1是武松,那就以最后这个k value为准,能理解是吗?为准,没问题吧,好,第三点我们发现值是可以重复的,就说这个K不能重复,但是值可以重复map的这个值。Value。Value是可以重复的,或者说可以相同啊,可以相同的没问题吧。第地址还有一点,我们发现什么麦普的这个k value是无序的。
19:03
Map的这个K还有value是什么呀?是无序的,请大家这一块要注意无序。无序。顺序啊,无序,好,这一点大家注意,那么还有一个就关于这一个make,这个内置函数呢,我们也来看一下手册是怎么说的,来,同学们点到build in build in里面有个make,点进去大家看这里内建函数可以分配初始化,一个切片或者映射,映射就是我们的map,我们看一下映射初始分配创建赛制。取决于这个size子。取决于这个塞子,但产生的映射长度为零,塞子可以省略,这种情况下只会分配一个大小的初始值,能明白吧?就如果你不写这个呢,它默认就是一个。这个map函数就这么一回事,好,我把map呢。Make啊,我把这个make也给大家。
20:00
它的一个使用呢,也给大家整理到这里。这块OK。好,同学们,我把make也整理到这里。内内置函数的说明。他是干什么的呀?刚才是不是已经说的很清楚了,他是干这个事的。OK,那同学们那关于map的基本介绍和他的声明呢?我们就先给同学们介绍这里。
我来说两句