推迟延迟函数怎么在去语言中使用

  介绍

这篇文章给大家介绍推迟延迟函数怎么在去语言中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

<>强。匿名返回值的情况

package 主要      import  (   ,“fmt"   )      func  main (), {   ,fmt.Println (“a 返回:“,,()),//,打印结果为,a 回报:0   }      func  (), int  {   var 小姐:int   ,defer  func (), {   ,我+ +   fmt.Println才能(“a  defer2:“,, i),//,打印结果为,a  defer2: 2   ,}()   ,defer  func (), {   ,我+ +   fmt.Println才能(“a  defer1:“,, i),//,打印结果为,a  defer1: 1   ,}()   return 我   }

<强> B。有名返回值的情况

package 主要      import  (   ,“fmt"   )      func  main (), {   ,fmt.Println (“b 返回:“,,b()),//,打印结果为,b 回报:2   }      func  b(),(小姐:int), {   ,defer  func (), {   ,我+ +   fmt.Println才能(“b  defer2:“,, i),//,打印结果为,b  defer2: 2   ,}()   ,defer  func (), {   ,我+ +   fmt.Println才能(“b  defer1:“,, i),//,打印结果为,b  defer1: 1   ,}()   ,return 小姐://,或者直接,return 效果相同   }

<>强先来假设出结论(这是正确结论),帮助大家理解原因:

<李>

多个延迟的执行顺序为“后进先出/先进后出”,

<李>

所有函数在执行RET返回指令之前,都会先检查是否存在推迟语句,若存在则先逆序调用推迟语句进行收尾工作再退出返回;

<李>

匿名返回值是在返回执行时被声明,有名返回值则是在函数声明的同时被声明,因此在推迟语句中只能访问有名返回值,而不能直接访问匿名返回值;

<李>

返回其实应该包含前后两个步骤:第一步是给返回值赋值(若为有名返回值则直接赋值,若为匿名返回值则先声明再赋值);第二步是调用RET返回指令并传入返回值,而RET则会检查推迟是否存在,若存在就先逆序插播推迟语句,最后RET携带返回值退出函数;

因此,? ?推迟回来,返回值三者的执行顺序应该是:<强>返回最先给返回值赋值,接着推迟开始执行一些收尾工作,最后RET指令携带返回值退出函数。

<>强如何解释两种结果的不同:

上面两段代码的返回结果之所以不同,其实从上面的结论中已经很好理解了。

<李>

<代码> ()int> <李>

<代码> b()(我int) 函数的返回值被提前声名,这使得推迟可以访问该返回值,因此在返回赋值返回值我之后,推迟调用返回值我并进行了修改,最后致使返回调用RET退出函数后的返回值才会是推迟修改过的值。

<强> C。下面我们再来看第三个例子,验证上面的结论:

package 主要      import  (   ,“fmt"   )      func  main (), {   c, c:=()   ,fmt.Println (“c 返回:“,,* c, c),//,打印结果为,c 回报:2,0 xc082008340   }      func  c (), * int  {   var 小姐:int   ,defer  func (), {   ,我+ +   fmt.Println才能(“c  defer2:,,,我,,,我),//,打印结果为,c  defer2: 2, 0 xc082008340   ,}()   ,defer  func (), {   ,我+ +   fmt.Println才能(“c  defer1:,,,我,,,我),//,打印结果为,c  defer1: 1, 0 xc082008340   ,}()   return 和我   }

虽然<代码> c () int> c () int>

<强>即,我们假设的结论是正确的!

<强> D。补充一条,推迟声明时会先计算确定参数的值,推迟推迟执行的仅是其函数体。

package 主要      import  (   ,“fmt"   ,“time"   )      func  main (), {   ,defer  P (time.Now ())   ,time . sleep (5 e9)   ,fmt.Println (“main “, time.Now ())   }      func  P (t  time.Time), {   ,fmt.Println (“defer",, t)   ,fmt.Println (“P “, time.Now ())   }//,输出结果://,main  2017 - 08 - 01, 14:59:47.547597041  + 0800 CST//,defer  2017 - 08 - 01, 14:59:42.545136374  + 0800 CST//,P , 2017 - 08 - 01, 14:59:47.548833586  + 0800,中科

推迟延迟函数怎么在去语言中使用