6 go中defer关键字的用法

陌路散爱 提交于 2019-11-29 11:39:19

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!