defer关键字
defer是go里面处理异常的一个关键字,应用场景类似于java里面的finally,使用的时候就是所有的其他的正常的函数进程执行完毕之后都要执行defer。
也就是被defer修饰的函数或者语句都是等到所有的作用域内部的函数执行完毕才会执行。
而且defer修饰的语句应该是以压栈的方式存储在某一个指令栈里面,先放进去的后执行。
func main{
for i := 1; i < 5 ; i++{
defer fmt.Printf("%d" , i)
}
fmt.Printf("AAA")
}
//输出
AAA12345
defer 与匿名函数搭配使用
func main{
defer func(a,b int){
fmt.Println(a+b)
}()
f := func(a,b string){
fmt.Println(a+b)
}
defer f("a" , "b")
}
defer与panic
panic你可以理解为抛出异常,然后panic执行之后,如果没有recover的话程序就会abort,但是在之前defer仍然会执行,释放资源做一些收尾的工作。如果是在panic调用之后再调用defer那肯定是来不及的。先做预防
package main
import (
"fmt"
)
func main(){
defer fmt.Println("defer call")
fmt.Println("hello world")
panic("停止程序")
}
输出
hello world
defer call
panic: 停止程序
可以看到是先执行的hello world然后遇到panic函数之后就会先调用defer 后面的函数之后再去terminate我们的程序。
来源:https://blog.csdn.net/weixin_42427338/article/details/100801334