Go defer, panic, recover(四)

defer 关键字推迟其修饰的函数的执行。该函数会在调用其的函数return之前按照先进后出的方式依次执行。
它比较适合于文件的打开,关闭操作。我们可以在文件打开命令的后面直接写上个close语句,防止后面忘记。此时只需要将close语言用defer修饰即可。

for i := 3; i > 0; i--{
        defer func(n int){
            fmt.Print(n, ", ")
        }(i)
    }

上面这段代码的输出将会是1,2,3
因为我们调用了三次defer函数,参数分别是3,2,1;而它是在函数最好执行结束时按照后进先出的顺序执行的,所以输出就是1,2,3
defer有的类似java中的finally语句,即函数执行结束后去执行的语句块。
panic() 类似java中的raise exception. 当调用panic后程序将会抛出一个异常,进而导致程序结束
recover() 类似java中的catch{}, 它会捕获异常,进而使程序从panic中恢复,继续往下运行。

package main

import "fmt"

func a(){
    fmt.Println("Inside function a()")
    defer func(){
        if c := recover(); c != nil{
            fmt.Println(c)
            fmt.Println("Recover inside a!")
        }
    }()
    fmt.Println("call b")
    b()
    fmt.Println("call be finished")
    fmt.Println("exit a!")
}

func b()  {
    fmt.Println("inside b()")
    panic("Panic in b()")
    fmt.Println("exiting b()")
}

func main(){
    a()
    fmt.Println("exited main()")
}

所以通过defer, panic(), recover()三个,我们就可以实现类似java代码里面的try{}catch()finally{}行为

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容