1.第一种情况,.differ后面只能跟着函数调用逻辑,且是压栈操作,先入后出
如下代码:
package main
import "fmt"
func main() {
//go语言中并没有提供try,except,finally
//defer 是go体用的一种延迟调用的机制,它可以让当前函数执行完之后执行,对于python的with语句来说,更加友好
//此处有大量的逻辑要处理
fmt.Println("test1")
defer fmt.Println("defer test")
panic("error")
fmt.Println("test2")
//a := 0
//defer a++ defer之后只能是函数调用,不能是表达式
//如果有多个defer会出现什么情况,
//(1)defer 是将延迟执行的函数逻辑放在了栈中。多个differ是按照先入后出的顺序执行
}
2.第二种情况:defer执行时的拷贝机制,如下代码
package main
import "fmt"
func main() {
//differ语句执行时的拷贝机制
test := func() {
fmt.Println("test1")
}
defer test()
test = func() {
fmt.Println("test2") //打印的时test1
}
}
再比如
package main
import "fmt"
func main() {
//defer语句执行时的拷贝机制
x := 10
defer func(a int) {
fmt.Println(a)
}(x)
fmt.Println("test3")
x++
}
打印结果:10
因为:我们已经事先将函数以及参数值都压入了。
总结:defer本质上是注册了一个延迟函数,defer函数的执行顺序 已经确定了。
defer没有嵌套,defer的机制是要取代try except finally