先看一下一段关于defer的解释, 引自《Go程序设计语言》
大意是说:
从语法上来说,defer 声明就像一个普通函数或方法,只是加了一个关键词为defer的前缀。当defer声明语句被程序执行时,函数和参数表达式被计算,但是直到包含defer声明的函数完成之后才被真正的调用,无论函数的结束方式是正常情况下执行return语句,还是异常情况下执行panic。可以声明多个defer语句,他们的按照声明的倒序执行。
吐槽一下自己先前的理解,以为程序执行时遇到defer语句时,跳过去,整个函数执行完毕再从下到上找到defer语句执行 =_=
很傻很天真,直到遇到下面的问题:
此处sleep 10 秒钟,思考一下打印结果。
想象着是:
4
defer 2 : 4
3
defer 1 : 3
实际运行结果是:
3
4
defer 2 : 4
defer 1 : 3
理想和现实有些差距,原因是想错了!
===========================================================
另一个问题:defer return 的执行顺序
引自《Go程序设计语言》:
上面代码中triple函数中的defer在return语句执行完成之后,更新了函数的返回值的变量result,所以结果如下:
double(4) = 8
triple(4) = 12
修改一下代码:
返回结果:
double(4) = 8
triple(4) = 8
我的理解是,执行return语句后,将result赋值给函数的结果变量,这个变量是匿名的。此时result和结果的匿名变量是两个变量,当defer语句更改result值得时候,结果变量不会改变。因此函数的返回结果仍然为defer执行前的result的值。
再修改一下:
结果如下:
double(4) = 8
triple(4) = 12
这里利用的指针传递