zoukankan      html  css  js  c++  java
  • GO基础之延时执行

    一、延迟是什么?
    •即延迟( defer)语句,延迟语句被用于执行一个函数调用,在这个函数之前,延迟语句返回。


    一、延迟函数

    1、可以在函数中添加多个defer语句。
    •当函数执行到最后时,这些defer■语句会按照逆序执行,最后该函数返回。特别是当你在进行一些打开资源的操作时,遇到错误需要提前返回,在返回前你需要关闭相应的资源,不然很容易造成资源泄露等问题
    •如果有很多调用defer,那么defer是采用后进先出模式
    •在离幵所在的方法时,执行(报错的时候也会执行)

    package main
    
    import "fmt"
    import (
        "base"
    )
    func main() {
        defer funcA()
        funcB()
        defer funcC()
        fmt.Println("main over...")
    }
    
    func funcA() {
        fmt.Println("这是funcA")
    }
    
    func funcB() {
        fmt.Println("这是funcB")
    }
    
    func funcC() {
        fmt.Println("这是funcC")
    }
    View Code

    延迟方法(defe的数据结构类似于栈)

    package main
    
    import "fmt"
    
    type person struct {
        firstName, lastName string
    }
    
    func (p person) fullName() {
        fmt.Printf("%s %s", p.firstName, p.lastName)
    }
    
    func main() {
        p := person{"Steven" , "Wang"}
        defer p.fullName()
        fmt.Print("Welcome ")
    }
    View Code

    带参数的defer函数

    package main
    
    import "fmt"
    
    func main() {
        a := 5
        b := 6
        defer printAdd(a, b, true)
        a = 10
        b = 7
        printAdd(a, b, false)
    }
    
    func printAdd(a, b int, flag bool) {
        if flag {
            fmt.Printf("延迟执行函数printAdd() ,参数a,b分别为%d, %d , 两数之和为:%d
    ", a, b, a+b)
        } else {
            fmt.Printf("未延迟执行函数printAdd() ,参数a,b分别为%d, %d , 两数之和为:%d
    ", a, b, a+b)
        }
    }
    View Code

    二、宕机panic和宕机恢复recover


    (―)、panic和recover机制
    1、概述:
    • panic:词义__恐慌recover:"恢复_■
    • Go没有像Java那样的异常机制,它不能抛出异常,而是使用了 panic和recover机制。一定要记住,应当把它作为最后的手段来使用,也就是说,我们的代码中应当没有,或者很少有panic这样的东西。
    • go语言利用panicO, recover(),实现程序中的极特殊的异常处理
    〇 panicO,让当前的程序进入恐慌,中断程序的执行
    〇 recoverO,让程序恢复,必须在defer函数中执行
    〇 Panics—个内建函数,可以中断原有的控制流程,进入一个令人恐慌的流程中。
    〇当函数 F调用panic,函数 F的执行被中断,但是F中的延迟函数会正常执行,然后F返回到调用它的地方。在调用的地方,F的行为就像调用了panic。这一过程继续向上,直到发生panic的goroutine中所有调用的函数返回,此时程序退出。
    〇恐慌可以直接调用panic产生。也可以由运行时错误产生,例如访问越界的数组。
    〇 Recover是一个内建的函数,可以让进入令人恐慌的流程中的goroutine恢复过来。
    〇 recover仅在延迟函数中有效。在正常的执行过程中,调用recover会返回nil,并且没有其它任何效果。如果当前的goroutine陷入恐慌,调用recover•可以捕获到panic的输入值,并且恢复正常的执行

    package main
    
    import "fmt"
    
    func main() {
        funcA()
        funcB()
        funcC()
        fmt.Println("main over")
    }
    
    func funcA() {
        fmt.Println("这是funcA")
    }
    
    func funcB() {
        defer func() {
            if msg := recover(); msg != nil {
                fmt.Println("恢复啦,获取recover的返回值:", msg)
            }
    
        }()
        fmt.Println("这是funcB")
        for i := 0; i < 10; i++ {
            fmt.Println("i:", i)
            if i == 5 {
                //panic("funcB恐慌啦")
            }
        }
    }
    
    func funcC() {
        defer func() {
            fmt.Println("执行延迟函数")
            msg := recover()
            fmt.Println("获取recover的返回值:", msg)
        }()
        fmt.Println("这是funcC")
        panic("funcC恐慌了")
    }
    View Code
  • 相关阅读:
    BZOJ 2326 数学作业
    BZOJ 4448 情报传递
    BZOJ 4443 小凸玩矩阵
    BZOJ 1852 最长不下降序列
    BZOJ 4373 算术天才⑨与等差数列
    68285
    65656556
    D. Points in rectangle
    恐怖的怪物
    再战斐波那契
  • 原文地址:https://www.cnblogs.com/jalja/p/11846027.html
Copyright © 2011-2022 走看看