defer fmt.Println("a")
defer fmt.Println("b")
defer fmt.Println("c")
输出:
c
b
a
先进后出,后进先出
总结:不管有没有异常,defer都会在函数出栈的前一步执行,所有只要函数没有出栈,defer修饰的都是会被执行的。
顺序:函数内其它语句-defer语句-函数出栈
//例1:
func f() (result int) {
defer func() {
result++
}()
return 0
}
//例2:
func f() (r int) {
t := 5
defer func() {
t = t + 5
}()
return t
}
//例3:
func f() (r int) {
defer func(r int) {
r = r + 5
}(r)
return 1
}
func f() (result int) {
result = 0 //return语句不是一条原子调用,return xxx其实是赋值+ret指令
func() { //defer被插入到return之前执行,也就是赋返回值和ret指令之间
result++
}()
return
}
//所以这个返回值是1。
//再看例2,它可以改写成这样:
func f() (r int) {
t := 5
r = t //赋值指令
func() { //defer被插入到赋值与返回之间执行,这个例子中返回值r没被修改过
t = t + 5
}
return //空的return指令
}
//所以这个的结果是5。
//最后看例3,它改写后变成:
func f() (r int) {
r = 1 //给返回值赋值
func(r int) { //这里改的r是传值传进去的r,不会改变要返回的那个r值
r = r + 5
}(r)
return //空的return
}
//所以这个例子的结果是1