介绍
A “defer” statement invokes a function whose execution is deferred to the moment the surrounding function returns, either because the surrounding function executed a eturn statement, reached the end of its function body, or because the corresponding goroutine is panicking.
作用
- 将被defer指定的函数 延迟到 外层函数返回之前执行。
- 当相关联的协程发生了 panic后执行
语法
1 | defer expression |
其中expression必须为一个方法或者函数
defer结构体
1 | type _defer struct { |
作用时机
if the surrounding function returns through an explicit return statement, deferred functions are executed after any result parameters are set by that return statement but before the function returns to its caller
如果外层函数有明确的返回值,那么在 返回值赋值给结果变量后,但在将结果变量返回给调用者前,defer函数此时执行。
1 | func TestDefer() int{ |
调用这个函数最终返回的值是 1
注意:
return操作不是原子操作,而是分成两个步骤:
- 将需要return的value赋值给一个变量
- 将变量返回
上述示例函数的实际执行顺序:
1 | anynomous := i |
anynomous是return过程中的一个匿名变量
defer函数的预计算
defer关键字调用时,会立刻拷贝函数中引用的外部参数;
1 | func TestDeferCalcu(t *testing.T) { |
当调用 defer func(i int){xxx}(i)时,会立刻将所引用的参数i给赋值;因此defer语句之后的 i++对defer内部的函数无影响;
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2021/08/07/golang/2021-08-07-defer/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!