package main
import "fmt"
func main() {
a := 1
b := 2
c := add(a, b)
fmt.Printf("end! c=>%d\n", c)
}
// a+b
func add(a, b int) (c int) {
c = a + b //此时,c=3
//两个defer,分别打开注释,看区别
//defer printC(addC(c))
//defer func() {
// c = printC(addC(c))
//}()
fmt.Printf("return! c=>%d\n", c)
return c
}
// 打印c
func printC(c int) int {
fmt.Printf("printC! c=>%d\n", c)
return c
}
// c=c+1
func addC(c int) int {
c++
fmt.Printf("addC! c=>%d\n", c)
return c
}
上面的defer,打印结果:
下面的defer,打印结果:
结论
return和defer的执行顺序:
1. 返回值赋值给c;
2. 调用defer表达式;
3. 返回给调用函数。
defer只是把最外一层函数体放在最后执行,其他的都是先执行。
1. 上面的defer,最外一层函数是printC,addC只是参数并不在printC函数体内,所以printC放在最后执行,addC按照正常顺序执行;
2. 下面的defer,最外一层是匿名函数,里面的printC和addC都是在匿名函数内部,所以整体都是最后执行。