6 go中defer关键字的用法

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我们的程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章