美文网首页
Go语言之defer语句

Go语言之defer语句

作者: 测试探索 | 来源:发表于2020-05-31 18:06 被阅读0次
    1. defer函数或方法

    一个函数或方法的执行被延迟了

    2. defer的用法:
    • 对象.close(),临时文件的删除。。。
        文件.open()
        defer close()
        读或写
    • go语言中关于异常的处理,使用panic()和recover()
        panic函数用于引发恐慌,导致程序中断执行
        recover函数用于恢复程序的执行,recover()语法上要求必须在defer中执行
    • 多个defer
      多个defer时,弹栈处理
    package main
    
    import "fmt"
    
    func main() {
        defer fun1("hello")
        fmt.Println("12345")
        defer fun1("world")
        fmt.Println("王二狗")
    }
    
    func fun1(s string) {
        fmt.Println(s)
    }
    
    //结果
    12345
    王二狗
    world
    hello
    
    • defer函数传递参数的时候:
      defer函数调用时,就已经传递参数数据了,只是暂时不执行函数中的代码而已
    package main
    
    import "fmt"
    
    func main() {
        a := 2
        fmt.Println(a)
        defer fun2(a)
        a++
        fmt.Println(a)
    }
    
    func fun2(a int) {
        fmt.Println("fun2()函数中打印a: ",a)
    }
    
    func fun1(s string) {
        fmt.Println(s)
    }
    //结果
    主函数中的a:  2
    主函数中的a: 3
    fun2()函数中打印a:  2
    
    • defer 函数注意点
      当外围函数中的语句正常执行完毕时,只有其中所有的延迟函数都执行完毕,外围函数才会真正的结束执行。
      当执行外围函数中的return语句时,只有其中所有的延迟函数都执行完毕后,外围函数才会真正返回,当外围函数中的代码引发运行恐慌时,只有其中所有的延迟函数都执行完毕后,该运行时恐慌才会真正被扩展至调用函数
    package main
    
    import "fmt"
    
    func main() {
        //defer fun1("hello")
        //fmt.Println("12345")
        //defer fun1("world")
        //fmt.Println("王二狗")
    
        a := 2
        fmt.Println("主函数中的a: ",a)
        defer fun2(a)
        a++
        fmt.Println("主函数中的a:", a)
    
        fmt.Println(fun3())
    }
    
    func fun3() int{
        fmt.Println("fun3()函数的执行。。。")
        defer fun1("哈哈")
        return 0
    }
    
    func fun2(a int) {
        fmt.Println("fun2()函数中打印a: ",a)
    }
    
    func fun1(s string) {
        fmt.Println(s)
    }
    
    //结果
    主函数中的a:  2
    主函数中的a: 3
    fun3()函数的执行。。。
    哈哈
    0
    fun2()函数中打印a:  2
    ```--++

    相关文章

      网友评论

          本文标题:Go语言之defer语句

          本文链接:https://www.haomeiwen.com/subject/vydrzhtx.html