00:00
好,各位同学,我们再来看一下defer的细节,那细节呢,我给大家准备了,呃,总结了三点,有些在前面其实已经讲过了,只是在系统的给大家过一遍。大家看第一句,当go执行到一个defffer时,不会立即执行defer后的语句,而是将defffer后的语句压入到一个站中,我为了讲课方便,暂时称该站为第站,是不是刚才就这么说的呀?然后他会继续执行函数下面的语句,就跟刚才老师在代码里面写的一样,当他执行到第ER的时候,他先把这句话压入到独立的dier站中。那么这个也是一样,加完了过后,他会继续往下面执行这句话,执行这句话,再执行这句话,OK,好当。大家看我这里面写的提示,当函数执行完毕后,就从低站中依次取出占点,从占顶取出语句执行,注意遵循或者要遵守站先入后出的机制,也就是说,先被押入站的。
01:04
那个语句实际上是后执行,反而后压入站的那个语句是先执行,能理解。这是我们说的第二点,第三点比较重要,在第一份将语句压入到站时,也会将相关的值拷贝同时入站。这句话是不是有点不好理解呀?什么叫同时入站?就是说他在把你后面这个语句压入站的时候,你这不是有N1和N2这些值吗?或者说不是N1N2,而有可能是一个什么资源,也是有可能的,只是老师还没有去做这个演示而已,如果说涉及到值的话呢,他会将相关的值拷贝同时入账。好,我把我我重点就是把第三一个给大家再做一个演示,因为前面第一点和第二点,其实在前面基础的时候,已然给同学们说过这个东西了,是不是,那同学们来看一下细节。我呢也给大家做一个说明,第一份。
02:03
Deferd,注意。注意事项。对不对和细节。我给他总结到这里。来一个标题三。嗯,前面的两点就是这一点。这一点其实我已经说过了,还有这一点我也我也说过了,是吧,第一点和第二点其实我们已经说过了,第三点呢,还没有说过,我们把第三点给大家来做一个案例。那我们看一个案例,大家一目而了然,我们看一段代码。这段代码呢,就在前面我们讲这个代码上稍微的做一个修改,你看我这里增加一句话。我增加一句话。增加一句什么样的话呢,我增加一个N1。加加,N2也加加。
03:00
同学们,我现在请问同学们思考一个问题,请大家思考一个问题,此时此刻,这个语句的输出顺序是不是还是不会变化的?没有变化,因为你这执行这两句话,对他的语句输出这个机制不会有改变,因此呢,仍然是刚才的一。234顺序,这个没什么可说的。那么我问大家一个问题,当N1加加过后,这个时候N1等于多少了?放到这个地方是不是你传进的是十,等它加加过变11了呀?能理解吗?那这个N2请问变成多少了?是不是就20加了个一变21了呀?那此时此刻。Result就是res等于11加21等于多少?是不是32?因此这个地方应该输出32。没问题吧,问题在这里。同学们请思考。这个时候,N2。这个N2不是他在后面执行的吗。哎,他在他是在这句话执行过后才去执行,那同学们可能会认为这个N2是不是应该等于21啊。
04:10
因为你在后面这些理论上说就这样子的呀,但实际上告诉大家,他仍然输出的是20。他仍然输出的是20,为什么这么讲?因为刚才老师说到这方有个细节,就是将第第份将语句放入站时,同时也会将相应的纸拷贝同时入战,那也就是说,也就是说当他把这句话压入到低分站的时候,其实他把N2这个值当时是是多少也也就已经入账了,这跟我们函数调用是一样的。能理解吗?那你原先这个N2是多少,是20,那就把20压进去了,同时他把20只拷贝压到这个这这个里面去了,所以说所以说你外面这个N1N2的变化对他没有影响。也就是这仍然是20,这仍然是十。
05:01
当然最后这个地方结果还是有影响的,因为你这res返回来还是32嘛,说最后结果是这样子的啊,OK3RESULT res等于三三十二,然后OK2N2等于20。OK。一等于十,最后这个32能理解吗?就这个细节经常用来做面试的时候会问到你,所以大家一定要注意这块的使用细节,来吧,同学们,我们试用一下,看看跟老师分析的是否一样。跑起来我。看效果。同学们可以看到。看。这个结果确实32,你看N2和N1仍然是一个20,一个十没问题吧,最后这个结果是32,好,这就是老师给他分析的结果,看清楚了啊好,最后呢,我们这个结果就分析完毕,我把这句话你给大家拿过来。放到我们笔记里面去。认识一下啊。好,把这块放到这儿来。那那这块执行完毕过后,它的结果我给大家整理一下,放这。
06:05
好吧,输出的结果是什么?好,他又在开始保存了,对不对。非常的讨厌啊,非常的讨厌。好,我这边挪一挪一挪,最后输出的结果我们看一下。输出上面代码输出的结果。结果证明了我们这一课入战时会进行只拷贝的结论,结果如下。怎么如下法?是不是这样子的。大家看刚才老师分析的结果就是这样子的。你在这执行的时候呢,首先这一块。32。二十十,这个也是32。对吧,顺序没有变化,但是值呢,呃,这个这两个值会变化,但是原先入战的时候只拷贝的还是20和十,没什么可说的。
07:01
注意这个细节啊,同学们一定要注意好。那么同学们关于defffer的这个细节说明我们就说到这儿了,说这,那么我们再来看一下defffer的最佳实践。刚才我们讲到differ最主要的价值是在于哪里呢?当函数执行完毕后,可以及时的释放函数创建的资源。它主要是这个用用处,那么看一下模拟代码大大家看这里,将来我们在后面学数据库的连接时,那么我们可能会去打开一个文件或者连接一个数据库,比如说我们打开了一个文件,这是这是一个示意示意代码啊,大家不要去管这个函数对不对,不去管它,就说比如说我打开一个文件,我会拿到一个文件的句柄。我会拿到一个文件的句柄,那么我拿到过后,我就可以马上执行fire.close我马上可以执行,因为有时候你会忘了执行吗?我,我用了过,我马上differ。但是呢,这个地方它又是在你这个test的执行完毕过后才才去关闭,所以说你在后面的时候呢,其实还是可以继续用这个fire,还是可以用fire这个句柄的,但用完了过后你就不用不用害怕了,因为你已经把它压入到differ这个站了,他一定会帮你关闭。
08:15
对不对,至于他什什么时候去关闭,那就是它死情,因为它函数执行完毕过后他去。关闭,所以说这这个特点呢,就是在我们勾浪里面,它就这样用的,就说打开一个资源过后,你马上地份,份完了过后你下面用用用不受影响啊,因为这个地方是在你所有执行完毕过后,他才去defer的。你看有些有些这个资源关闭的时机特别不好控制。很多代码里面,像像Java,有时候这个资源什么时候关闭,特别不好处理,那么go浪他把这个处理,把这个问题给你解决了,你你只要一打开,你就defer defffer完了,你你该怎么用就怎么用,用完了过后,最后函数调用完了过后,他才他再从这个differ站里面把这些资源一个一个给你给销毁了,多好。
09:00
非常不错,这种设计理念还是我还是比较觉得还是比较比较用起来比较舒服啊,比较舒服,因为有些时候就你要么就是容易忘记关,要么就是不知道什么时候关,那么我们的工单设计者把这个就给你处理好了。再看这地方,如果将来我们去打开了一个数据库,打开数据库我们会得到一个数据库的连接,那么拿到一个数据库连接过后呢,我们也可以马上dier,把这个连接关掉,然后下面继续用,注意啊,你DEF完了过后,这个连接可以继续用的啊,你千万不要理解成一旦defer了,这个连接就用不了,那就错了。不是不这样子的啊,不这样子的,就下面该怎么用还怎么用。理解吗?哼,这个是不是有点绕啊,就是你differ完了过后,File这个句柄可以用,你differ完了connect连接可以用,它是什么时候才去执行defer呢?就是你的整个这个函数执行完毕过后,他才去帮你销毁,所以说时机销毁的时机你就不用,你放心,你在函数里面怎么用都无所谓他,而且他会一定给销毁,这个呢,还是它的一个特别不错的一个机制啊,我个人认为好了,那我把defer的最佳实践呢,也给同学们放到笔记里边去。
10:10
来了。这个地方是我们的第几点,第四点吧,诶,这是它的细节啊,最佳实践最佳实践,我们就来个标题三吧。好吧,标题三,那标题三我们写了一段模拟代码,这段代码不是真实的啊,我写了一段模拟的代码。就是呃,表示了示意了一下differ的一个最佳使用的场景,因为同学们现在呢还没有学。文件编程和数据库编程,因此只能写一段模拟代码。好了,同学们,我把这个模拟的这一部分代码示意代码呢,你给同学们放到笔记里边去。我在这做一个说明啊,做一个说明,注意听第一点呢,就是。当。在沟浪编程中。
11:00
的充肠做法。在勾浪。Goon编程中的通常做法是,做法是。创建,创建一个资源后,创建资源后。什么叫创建资源呢?比如。打开了一个文件,打开了文件句柄。文件或者是得到连接。啊,获取了连接。获取了数据库。获取。数据库的连接。或者是有一个所啊,或者是所资源或者。或者是所资源。对吧,你你这个创建创建资源过后可以怎么样呢?可以立即立即。Defer就是比如说关闭对吧,比如说打个比方file.close。或者是诶这个地方我就四个亿啊同学们。
12:00
这个是是一代码啊,大家不去过于的去管它对不对,collect.close。对不对,可以理解可以。立即啊,可以执行。可以执行这句话。当然第二步你后面可以继续使用你的dier。在第一份后。第一份后。可以。可以继续使用打开的资源,或者叫创建的资源。啊,第三步当。当这个函数执行完毕后,完毕后。怎么样呢,系统啊,程序会这样子啊,系统也可以,系统会。会什么呢?依次依次。从第二站中。Defer站中取出,取出这个这个defer后面的语句,取出语句一关闭,关闭资源。关闭资源好,这个好处是这种设计理念的好处,是能够能够让这个程序员呢,及时的处理这个关闭的处理动作,而且呢,你也不用去关注什么时候关闭了,这这个时机他也帮你想的是特别好的函数,执行完闭,他帮你一个一个的销毁啊这样的设计理念。
13:20
这种机制啊,这种机制。这种机制啊,非常非常这个非常简洁非常简洁。啊,非常简洁对不对,那么程序员程序员不用。不用再为。在为。在为什么呢?在为何时,在什么时机啊,在什么时机。时机关闭,这个时机关闭资源而繁星了,关闭资源而繁星。啊,以前写代码的时候确实就有这个麻烦,同学们只要呃,如果说做过开发的同学呢,就会有这种感触,如果你没有做过开发,你会呃,你你你你可能感受不到啊,比如说我以前在用PHP的时候,在做PHP的时候,有时候就特别麻烦,就说不知道这个资源是在service关闭还是在model上关闭,或者说是在这句话前关闭,还是这句话后关闭,不清,不是特别的容易,也也容易是这块是是在那关闭的,这另外一块代码呢,又在另外一个地方关闭,它总是不统一,所以说呢,这样子这种机制呢,非常简洁,程序员呢,就。
14:31
大家就可以统一这样去处理了,好,非常好,好了,同学们,那关于defer的最佳实践以及defer的使用注意事项呢,我们就给大家介绍到这里,大家好好的领会一下,下去把它练习一把。好,关于这块我们就说到这。
我来说两句