总述:defer机制在Go语言中,提供关键字defer,可以通过该关键字指定需要延迟执行的逻辑体,即在函数体return前或出现panic时执行
defer与return的执行顺序是固定的,且只有一个答案:retrun表达式->defer->return(RTE指令)
一、defer函数的调用顺序
先看一段代码
package main
import "fmt"
func fun1() {
fmt.Println("A")
}
func fun2() {
fmt.Println("B")
}
func fun3() {
fmt.Println("C")
}
func fun4() {
fmt.Println("D")
}
func main() {
defer fun1()
defer fun2()
defer fun3()
defer fun4()
}
猜猜看最后打印的顺序会是什么呢?(打印顺序如下图)
但这是为什么呢? 其实defer是按照栈的顺序进行调用 ,我们来看一下下面图片演示的过程吧
二、defer与return的调用顺序
先看一个代码
package main
import "fmt"
func deferFunc() int {
fmt.Println("defer func called...")
return 0
}
func returnFunc() int {
fmt.Println("return func called...")
return 0
}
func returnAndDefer(a int, b int) int {
defer deferFunc()
return returnFunc()
}
func main() {
returnAndDefer(1, 2)
}
运行结果如图
很显然return在defer前执行