00:00
下面我们再给大家介绍一下map的使用细节,Map使用细节呢,我这里给大家总结了三点,都非常的重要,都非常重要,我们来看一下map使用细节有哪些地方好,我们先把它说一下,第一个首先我们要非常清楚的知道,Map呢,它是一个引用类型的数据类型。那既然它是引用类型的,因此呢,他在,呃,他就会遵守引用传递的机制,什么机制呢?就是说如果我们用一个函数来接收一个map,修改过后会直接修改原来的map。也就是说map它是引用类型的,这点大家一定要注意,跟切片一样,切片是引用类型,Map呢也是引用类型,这点请大家注意,好,我把这个呢给大家整理一下,然后我们举一个例子说明一下它的使用特点。Map的使用细节,我们给他一个标题二,好的。第一个地方,好吧,刚才老师已经说到了。它是一个引用类型的,对吧,那么我们举个例子来证明这个特点。
01:04
嗯,我们老规矩来打开这一个地方,我们新建一个文件夹,叫map细节details。好,然后呢,我们新建一个文件may。没点go。OK,然后呢,我们同样从这边粘一个共用的部分出来。好,放这,因为salt一时半会用不上,先把它去掉。好,我们先讲迈普细节的第一点。第一点,是不是刚才已经说过了,它是引用类型?好,我把这句话呢给大家放到这里来。那我们写写一个案例来测试一下这个特点是不是正确的,首先呢,我写一个函数。我写一个函数,好的,那写一个函数,比如叫modify。Modify OK,在这里我去接收一个map,比如说我这个名字就叫MAP1 OK,然后呢,类型,我们这个类型呢,比如说就叫int类型,好吧,这样看起来也比较简单。
02:08
好在这里面我拿到这个MAP1过后呢,我找了,我把它的一个值取出来了,比如说它这里面有一个下标为十的。那我把它改成了多少呢?我把它改成了。这么多改成了900。好,然后呢,注意当然这个地方我要确保确实有一个K为十啊,那我在这在这个主函数里边呢,我来定义一个啊,我来声明一个map,比如说这个里面有一个MAP1对不对,走我make一下,Make一个什么样的map呢?类型就是这样一个类型。好吧。没问题吧,然后我就开始往里面放东西了,第一个呢,我放了一个1K为一的,它是等于90MAP。还有一个下标为二,K为二的,再放了一个什么呢?比如说等于88,再来一个MAP1,它的K等于12就跟它对应上了啊,我估计这样子改一下,那这个十呢,我给的是一,好,再来一个map等于20的好可以了。
03:16
写个二,然后我调用这个modify,注意听我调用这个modify。然后呢,调用modify的时候,我把这个map一传给了他,传给他过后我在后面输出print f map1,好,这个地方我们要观察一下,此时此刻,这个MAP1里面的这个K为十的。这个元素的值啊,它的对应的值吧,是一呢还是900,如果它是900,就说明它的确是引用传递类型。如果它仍然保存,保存是一,那就说明它默认就是直拷贝,就是直传递了,我们来拭目以待啊,看看这里的结果。看看结果,好,同学们,我们运行一把。
04:03
我们运行一下这段代码CD,点点上一节CD到刚才的map,我们叫details,好,Go run main.go跑起来我们可以看到这个结果,诶,这是有问题是吧?哦,没有进到里面去,写错了,CD到map detail。哎,Detail。对吧,这个才对,Go run main.go跑起来我们看效果。我们看到这里面输出的结果跟我们想的和我们分析的是一样的,大家看这里。K为十的变成了90 900。那也就是说,当我们把这一个map传给modify这个函数过后呢,它这里面的修改会直接影响到M里面的MAP1,那说明什么?我们发现结果是修改了就是map。一对应的这个十,它等于多少呢?等于900。
05:01
从而说明我们这个麦它是引用类型,能理解吧?好,我把这个写到这儿说明。说明,Map是引用类型。引用类型。没问题了吧,通过这个东西我们就说的很清楚很到位了。好,那关于map是引用类型这个特点呢,我们先给大家板述一下。大家看这里啊。这个地方我们可以得出,确确实实是变化了。他这一帮变成了他了。OK。所以说结论。结论是什么?脉搏是引用类型?好,我把这个板述到我们这块来,没问题吧,非常的简单,我们再来看麦使用的第二一个细节是什么呢?就说麦容量达到后再想想,再想map普增加元素会自动的扩容,并不会发生panicle,但是切片不可以,切片得用aend的才可以,对不对?也就是说map能够动态的增长键字段,那么我们把这个呢,再给大家演示一下,其实前面已经说过了,只是老师呢,再把它系统的整理到这个位置,能理解吧。
06:14
好,我们看一个案例,还以这个案例说话吧,比如说你看这个地方已经不用说了,你看你你这地方没有没有扩,没有写定,比如说我就直接写个二。我默认它最多只有。默认给它的这个容量是二,但是实际上你看我在这个map的时候,到这个MAP10的时候,其实就已经超过二了,但是它仍然没有报错,没有报错,你看我这样运行,它仍然是正确的跑起来。我们可以看到代码并没有报错,这说明什么?这说明我们麦它的的确确可以自动扩容啊,这个结论呢,放到这就可以了,我就不再多说了。第三个细节,这个也很重要,来看一个。再看第三个细节。
07:00
我在这里总结了这么一句话,就说map的value经常会使用,使用到结构体,Structure就是结构体,它更适合管理复杂的数据,比前面我们这个value用map更好。大家还记不记得前面我们记录一个学生,学生的信息我是用一个麦谱来记录的,其实这个并不好。用map记录这个学生信息并不好管理,那用什么比较好呢?用结构体这个数据类型比较好,但是非常遗憾。非常遗憾的就是因为还没有学学习这个结构体,因此呢,老师只能在这样,在这地方给大家写一下,让大家先体验一把,注意啊,因为大家还没有学习结构体,但是这个地方呢,我又必须让大家知道,其实迈普这个值用结构体其实用的更多,所以说我在这里呢,这里呢先给大家写一段代码,让大家体验一下,尽管大家还不太明白结构体是什么,但是它也不难,先体验一下,好吧,不要不要说,诶老师你还没讲结构体,怎么就用结构体了呢,因为结构体马上就要用,没有马上就要讲了,而且结构体本身也不是很难的,OK,好,来体验一把吧,我们我们对前面这个案例进行一个修改,我们用。
08:17
我们用这个,我们用这个这个map k呢,还是他的学号,然后它的值呢,我们用结构体来完成,好吧,来看一个案例,注意听我的要求。现在我们写一段代码来证明这个它的用法。好的,我们来整理一下。把这个要求先粘过来。把这个要求先粘过来。OK。可能大家听起来有点吃力啊,可能大家有点吃力,好,现在我要这么写,就说我定一个map map map的K。为什么呢?为学生的。学生的学号。
09:01
是唯一的,因为学号肯定是不同嘛,是唯一的。然后呢,这个麦。麦的子。Map的值就是那个value。Value呢为一个结构体。结构体包含。包含学生的什么信息呢?比如说他的名字。年龄年龄我要用int类型啊,然后呢,还有他的地址。地址。好,我们现在看看怎么做这个事情,首先第一步我先要定义一个结构体。啊,或叫生命一个结构体都可以。定义一个。一个学生结构体。好,我开始写了啊,Type student。Ru,大家可能看不太懂,大家体验一下啊,我再说一遍,只是体验一下,然后这里面呢,有三个元素,我们把它定义下来,有三个元素,刚才我在幻灯片里面看是哪三个元素啊,就是name,年龄和grade,好可以。
10:05
呃,首先第一个类名字咱们得要。是吧,时钟类型的,然后呢,我这说的还有一个是年龄,年龄呢age。年龄,我们用int类型,还有一个是家庭住址,家庭住址比如ADS时数类型,好,同学们,这个就是它的一个结构体。这个就是一个学生结构体,那么有了学生结构体过后呢,我们来。呃,声明一个map了,就可以map开始了啊,我们这样写。嗯,我待会儿要放很多学生进去students。石雕。Students。找make。我们也可一个什么呀,我们也一个这样的map。他还是迈普。但是。但是这个map的K我们用十寸,但是它的值呢,我用的是。
11:00
这个结构体。小字大家看懂了没有,然后默认我给他来。来十个学生吧,啊,当然你也可以不写啊,不写好写完了。这个就make完毕,那现在呢,我们来开始创建,创建三,我们创建两个学生吧,两个学生。好,开始写了啊。第一个学生STUDENT1。走啊,那么怎么去创建一个学生呢?非常简单,其实就是把这个结构体拿过来。拉过来在里面写上他的信息就可以了,比如说第一个,第一个我们需要给他的是。Name name的值。内蒙呢,我们给他一对啊,比如说第一个人的名字叫汤姆,他的他的这个年龄是一个整形,比如说他是18岁,你看这样是不是结构体就很丰富了,他结数据类型还可以不一样,对吧,这是一个冒号。然后再来一个逗号,好,然后呢,它还有一个家庭住址ADD res,注意ad re这个要跟它一致啊,要跟它的名称一致。
12:08
然后这边呢,啊比家庭住址是北京。好这个就写完了,写完过后,这后面有个逗号给它带进去,那我们输出一下先。我们输出一下。OK,他这地方有个小问题,我们把它整理一下啊,我们看看这个地方的问题是什么,我们排除一下。好,这样子啊,咱们简单一点,不用写这么复杂,直接就给值就完了,就不写,因为它这个比较简单,三种数形就直接这样给值,就不用键字段的方式给了啊,不用这个属性名方式给了,直接这样给就完了,比较简单啊,这样做就就行了。保存一下。好,这这种就比较简单,诶北京这少写了一个东西。好这样就可以对吧,我们输出一下。有一个学生呢,我们再来看第二个学生。
13:00
我们写两个学生。第二个学生呢,是Mary。是Mary。Mary。对不对啊,这样Mary,然后他的年龄呢,比如说是28岁,他是住在上海的。上海可以吧,好,这是第二个学生,现在我要把这两个学生交给这个值,好,同学们看我怎么放进去,这样写了,Student。第一个学号它的K,我们先给他,他的K呢,比如说是NUMBER1。他是哪个学生呢?16等等于一完事了,再来看第二个。第二个学生。对不对,这个学生也取出来了,你看这样子是不是更好管理NUMBER1NUMBER,好,我把它输出来format。人好输出我们的students。保保存一下。好,我们看看代码有没有问题。好,代码现在没有报错,我们来试一下,看看此时此刻是不是已经把用这个map把这个学生保保保留起来,也就是说这个值已经是个结构体了,当然很很,这样肯定是更好保存一个学生的信息,对不对?
14:16
好,我们来执行一下。跑起来,我们看效果。我们可以看到此时此刻这个结构体的信息呢,它就输出来了,而且很很清晰,看到没有map里面有一个NUMBER1。K number1他是什么呢?他是个结构体,里面是汤姆,18北京第二个学生是NUMBER2,他是Mary 28上海,这样子是不是很更好一点?对不对?为什么说更好呢?因为你将来这个结构体的数据可以很轻松的增加它的这个组成部分,比如说再增加一个属性就很轻松了,对不对?好,那么我再讲一下如何便利,一个学生就说,现在呢,我们想把每一个学生具体的信息取出来,怎么做好,我来写一个便利。
15:01
便利各个学生的信息。好,跟上老师思路,因为他已经是个map了,大家是不是学过怎么去编辑一个map呀,For。For第一个把K遍历出来,把值遍历出来,然后等于range,这时我们遍历student。这个没问题吧,那么这个K就是学生的。编号V就是一个结构体,还记得吧?好,我现在其实已经可以打印出来了。我把它格式化一下啊,Print。PTF,注意听讲,我说学生的编号。是,好,我说出来。怎么说呢,实际上就是K。没问题吧,好,紧接着我们把学生的名字、年龄、住址也输出来。学生的。学生的名字是。名字,它的名字怎么取呢?好就是VV是不是一个结构体点儿名字,看这样子多方便。
16:06
对吧,他的年龄。年龄是OK,那就是V v.H。好结构体虽然我们还没学,但是呢,大部分同学能看出来啊,就是V点,就是把这个结构体的属性取出来,或者叫元素取出来都可以,最后一个它的地址。地址是好。同样。V。点。At home address。ADD res是吧?Ad res,好,这个地方呢,我们每输出一个,我们就换一行,好吧,换一行这样子看起来就比较舒服一点。好的。OK,那那我遍历遍历一个遍历一次,最后我再换一行就可以了。Print,这样子就有一个间隔线,好同学们,我们执行一下,看看便利的时候是否已经成功跑一下。
17:06
我们可以看到,诶这个信息还是非常清晰的,他说第一个学生的编号是NUMBER1,名字,年龄北京,第二个学生的编号是NUMBER2,名字,年龄上海。对不对,没问题吧,好同学们,那么我们这里面就讲了我们这个map使用的第三个细节,就是在我们实际开发中呢,这个value其实更多的情况下用的是结构体这种数据类型,而且大家应该能感受到这种方式来保存和管理数据应该更加的方便,而且更加的灵活,好同学们我把这个板书一下啊,同学们看一下它的具体的使用。OK。呃,这块。呃,这一块我看看前面讲的应引用这个已经说了吧,引用已经说过了,好,那就是第三点了。第三点我们把它放一下,第三点就是从这开始截取对吧,代码也比较简单。
18:03
从这开始。讲了一下map的value呢,我们更多情况下会使用结构体。好,放到这里。大家看能不能看懂。应该还是比较简单,对不对,还是比较简单,并不难,好同学们,那么关于我们所说的这个map的使用细节呢,老师就全部给大家讲完了,这里面尤其要注意第三点,还有就是map是一个引用类型,还有就是它的容量会自动增加,好这是map的使用细节,我们就先给同学们介绍到这。
我来说两句