被defer关键字修饰的函数会在**defer所在的函数 return之前 再执行。
例如:
func int() int {
defer release()
****
****
return 0;
}
// release方法会在return 0之后执行(xxx)
return并非一条原子性语句
在return时会调用 defer函数
例如;
func f() (r int){
t := 5
defer func() {
t = t + 5
}()
return t
遵守以下规则进行return:
- 返回值 = xxx (定义的返回什么就是什么)
- 调用 defer 函数
- return
那么,return t应该改写为:
r := t //r = 5
// 调用defer函数:
func() {
t = t + 5
}()
return
可以看到,defer函数并没有改变r的值,所以返回值应该是5
再例如:
package main
import "fmt"
var g = 100
func f() (r int) {
r = g
defer func() {
r = 200
}()
fmt.Printf("f: r = %d\n", r)
r = 0
return r
}
func main() {
i := f()
fmt.Printf("main: i = %d, g = %d\n", i, g)
}
return r应该改写为:
r = 0
defer func() {
r =200
}()
return
此处的defer函数改写了r的值,所以返回值是200
注意:
- defer 在 Panic之后任然可以执行
- defer遵守栈规则,即多个defer 后面的先执行