00:00
那么各位同学,我们再来给大家介绍一下,在go浪里边,函数里面有一个关键词叫defer,这个defer听这个名字呢,它是一个延时的意思,那为什么在这个go浪里面,它增加了一个defert这个关键词呢?啊,这个词它是非常有用的啊,大家看在函数中,程序员呢,经常需要创建资源,这块呢,我们现在还没学创建资源啊,但是呢,呃,我可我可以先给他介绍一下,比如说后面我们去这个打开一个数据库的连接,或者打开一个文件句柄锁等等,这些呢都是资源。你理解吧,这些都是资源。那为了在函数执行时完毕啊,执行完毕后及时释放资源呢?够的设计者提供了一个defer这个延时机制,就是说你只要加上这个defer,那么你的函数在执行完毕过后,它一定会把你的指定的这个资源关闭,或者说你der后面这个语句在函数执行完毕过后,它会去执行,就这么一个意思。
01:03
好,那我举一个快速入门案例来加深一下大家对它的认识,来吧,我们呢,先把它做一个基本介绍。函数中的dier。好,我们可以看到在这里写一个哈。写个。底分我们写到这里。函数。函数中的底份,函数的底份,这样就行了。Defer OK。那么函数底分是干什么的呢?我们来做一个介绍。我们来一个标题二,对不对,来个标题二。刚才老师也做了介绍,就是说在函数执行完毕以后,我们先说一下为什么需要低,对吧。为什么需要底份儿?
02:01
标题三,嗯,在函数里面使用defer最主要的目的就是干什么呢?就是在函数执行完毕后及时的释放资源。我们可以用低分来完成这个功能,那我们来一个快速入门案例。我们先来认识一下低分是啥?来一个标题三。快速入门案例,那么我们写一段代码,同学们看,我这里已经写了一段代码,这个代码很简单,我也直接拿过来给大家用一用就行了,好不好?这也不难。那么我们重点是分析这段代码会出现运行什么效果,来,我新建一个,我新建一个。文件夹。就叫differ。DEMO。然后呢,在这里边我们新建一个文件叫面顶构。好,然后我们把这个程序的价值搭起来,对不对,Package me,然后呢,我们import。
03:02
我们import一个包包。这个包包呢,就是我们写的format这个包,然后我写上一个组合数。哦哦,这个主函数就不用写了,刚才代码里面其实也都有了,对不对,我粘过来用一下就行。代码稍微的整理一下。把整理一下啊,同学们看这段代码呢,它是这样子的,我们来看一下。来看一下这个代码会输输出什么内容,怎么看这里。这里有一个主函数。主函数,这个主函数调用了一个sum sum呢就传了一个十和20进去,然后返回一个int值在这里,这一个different。这个DEF语句。这里又有个differ语句。对吧。那么这边呢,把N1和N2加起来过后,交给了一个result变量,然后我输出一个OK result3的result等于这个值,然后再把result返回来,返回来,但是返回这个函数了,对吧,我们可以把它接收到。
04:05
比如说我在这里接收一下这个值没问题吧。然后我输出在主函数里面也输出。Print打出来,而也等于值,现在呢,我们要研究一下这一句话,这句话,这句话,这句话分别是怎么输出的。然后通过这个呢,我们就能认识到dier,它是怎么来执行的,好不好。好,这段案例我先告诉大家,它执行的顺序是这样子的,首先它调用sum到这,当我们的这个代码执行到第份的时候,我们这个编译器或者说我们的系统会将什么呢?会将这一句话压入到一个站中。压入到这个战中,注意听,就是defffer defer这个语句会暂时不执行,就是说defer执行到这句话的时候,他先不执行这句话,而是把这一句话呢压入到一个叫低分的站中,我把这句话写到这里来。
05:01
当直行到追听differ时。啊,会将。会什么呢?会将。就说我们的系统啊,我们的系统会将differ后面的语句,Differ后面的语句,后面的语句压入到。压入。压入,诶,这个压是这个压压压入。哎,也不好出出来加入到战中,加入到一个独立的战中,独立的战中,我们姑且把这个叫做DEF2站吧,没问题啊,就把它认为是个地ER站,但是这个站呢,它是一个独立的站,跟我们呃,这个上站还有命站,不是不在同一个地方。他暂时不会执行。暂时不执行。不执行。不执行。
06:01
他不执行,会将第后面一句压入到读音当中,同样这句话也是一样的适用,也就是说大家可以想象这两句话先不会执行。他会把它压压入到独立战中,什么时候执行呢?注意听这句话。当。当这个成语当这个函数。当。函数。执行完毕后。完毕后再。再从这个differ战中。第二章中取出啊,按这个,按这个先入后出,注意听这句话是按照。按照什么呢?按照先入。先入后出。啊,这个还不行啊,先入。后出的方式。后出的方式执行。方式,按照先入后出的方式出战。
07:03
出战。然后执行执行。理解,那也就是说谁先进去,反而是后执行的。明明白的意思吧,好,然后呢,注意听啊,现在这两句话呢,执行完毕过后,相当于说这句话和这句话被压入到different站里面去了,然后他执行的result这个值,此时此刻大家都知道result等于多少了呢,Result其实就等于了多少,就是你传进来一个十和20,那应该就等于30,于是他先执行的是这第一句话,第一句话是这。他会在这里执行result OK,三等于多少呢?等于30。这是我们的第一句,第一句执行完了后,再执行这个return,这个return,执这个return执行完毕,执执行了过后,那显然函数就执行完毕了,就是上执行完毕了,他他执行完毕过后,他就会从这个站里面开始取东西了,也就是说result return过后,Return过后这个sum就相当于执行完毕了,是这意思吧。
08:03
那执行完毕过后呢,注意他先不会执行这句话,他先执行,因为我刚才已经讲了嘛,当函数执行完毕后,再从低分站按照先入后出的方式出出战来执行,那也就是说谁先入战的。谁先入账后出,你看这个是不是先入账。他就后出来,这个是不是后入站,也就是说你可以想象同学们,我如果画个图的话,你可以想象到在这你认为有个叫differ的这个站。这个地方站,他先把哪句话压进来的呢?他先把这句话。这句话他压到这个站里面去,也就是说这个句话被压入到这个站了,啊意思意思然后呢,这句话。后面这句话被压入到这个这个位置了。那同学们,他在出站的时候,他其实是先把这个站顶的弹出来执行,那站点弹出来是哪句话,其实就是OK2NUMBER2这句话执行完毕过后,再弹出这句话再执行,那也就说再执行的是OK1,等于是什么?明白吗?好,那也就是说这个地方是第二句。
09:09
它会输出什么OK2。等于多少呢?OK 2N2。等于我们的N2这个值N2,你传接是不是20,所以这个是20,好,紧接着再出这个站就是三点第三,第三句出的反而是它就应该是OK几呢?OK3OK1等于多少呢?N1。等于N1的这个值等于十。那也就说是这句话先出再说这句话,再说这句话,最后这个这里面的第站全部都执行完毕过后,再回到这个这句话了,他会把这个值返回给result是不是,然后呢,再执行这句话,也就是说第四句话才执行的是这个。Res,等于多少呢?等于算出来结果一是不是N1加N2啊,那就是30,所以它是30,最后顺序是一。
10:04
234这个就是它的作用,那第分在这起的作用就是说白了它起的作用就是说我可以把一些这个函数执行完毕过后要执行的语句,先把它压入到地方站中,等到它这个函数执行完毕过后,再依次的执行。这个很有用啊,在资源进行释放的时候,我们经常会这样做,后面我还会说这个事情来,先根据刚才老师的分析,我们看可以看看在后台,就是在这个执行过后,顺序是不是跟老师分析的一模一样,来走一个CD点点。好,我们现在这样做啊,同学们,这个地方我们重新进一下,可能刚开始我做了一个什么测试来进到D。Go project进到这里面我们有一个chapter,然后我们是叫def DEMO,然后进到这里面去SD来吧,朋友们,Go。
11:03
Go run,面点go,跑起来。我们现在看看效果跟老师分析的是不是一样的,同学们看看我的结果,看我的分析,看我的分析来。朋友们看。同学们看一下。第一句OK,三。没问题,正确第二句OK2没问题。第三句OK,一一等于十也没问题。最后一句。Result res等于什么?30也没问题,好,这个跟我们分析的完全一样。主主要是要把搞清楚这个原因啊,就是老师把这个句话说出来,就说differ的执行的顺序,以及他为什么这么执行呢?其实是因为这个原因。理解吗?OK,好,同学们,我把这一句这个案例先给同学们站到这里来好不好,然后呢,我把刚才执行的这句话。
12:00
还有那个那个结果给大家放到笔里面去,大家看关键的地方就是这个地方。OK。好,这个地方我做了说明,然后呢,我把它放在我们比例里面去,对不对,我把执行输出的结果也给大家,也给大家写到这。输出的结果。或者叫执行的结果对不对啊,执行过后。执行后输出的结果。我把它放到这里来。好,给他来一个标出,这样看的比较清晰一点,然后我把结果呢,给它放到这里来。好,给他搁这儿。好,放好。对不对,好,这是我们一个快速入门,就给大家介绍到这这里了,那关于dier后面的细节呢,我们。在下一节再为大家讲解,OK,那关于第份的基本说明,我们就说到这里。
我来说两句