defer综合
defer语句会在以下几种情况下被执行:
Each time a "defer" statement executes, the function value and parameters to the call are evaluated as usual and saved anew but the actual function is not invoked. Instead, deferred functions are invoked immediately before the surrounding function returns, in the reverse order they were deferred. That is, 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. If a deferred function value evaluates to nil, execution panics when the function is invoked, not when the "defer" statement is executed.
每次执行defer语句时,会将其定义的函数和参数保存在一个栈中,但是定义的函数并不会被执行。但是,在外层函数退出之前,defer函数会按照定义的顺序逆序执行。如果外层函数通过显示return语句返回,则defer定义的函数是在设置结果参数之后,返回调用方之前执行。如果defer要执行的函数为nil,则会在定义的函数调用时产生panic,而不是defer语句执行时。
1. defer原理分析
a. 多个defer执行顺序
当一个函数中存在多个defer语句时,函数返回之前会按照defer定义的顺序逆序执行,也就是说最先注册的defer函数最后执行。
b. defer语句执行时拷贝时机
当defer语句执行时,会将当前时刻的函数值和函数参数进行注册。注册完成之后再次修改函数值和函数参数将不会生效。
c. return & defer
return x :返回值 = x + RET指令
defer 原理 :返回值 = x + defer语句 + RET指令
d. defer & 闭包
func main() {
x := 1
defer func() {
fmt.Println(x) // 2
}()
x++
}
上例中的 func()是一个闭包,闭包的变量本质是对上层变量的引用。
type Closure struct {
F func()
x *int
}
相比于直接调用函数,延迟调用需要花费更大的代价。这其中包括注册、调用等操作,还有额外的缓存开销。
对于性能要求高且压力大的算法,应该尽量避免延迟调用。
最新文章
- python code
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
- MFC如何读取XML
- acm入门 杭电1001题 有关溢出的考虑
- windows phone 水印TextBox
- jquery 实现类似于弹幕效果
- js如何判断手机机型
- 蛋疼的vs
- UITextField中文搜索
- UVALive 4043 Ants 蚂蚁(二分图最佳完美匹配,KM算法)
- [转]ASP.NET 页生命周期概述
- UVA 1001 Say Cheese 奶酪里的老鼠(最短路,floyd)
- 库函数strlen源码重现及注意问题
- POJ 1410 Intersection(线段相交&;amp;&;amp;推断点在矩形内&;amp;&;amp;坑爹)
- AFNetworking 动态修改acceptableContentTypes 设置ContentType
- vim操作备忘录
- App测试的策略
- DL_WITH_PY系统学习(第2章)
- html5 canvas旋转+缩放
- Arduino驱动无源蜂鸣器发声