欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

GO基础之延时执行

程序员文章站 2022-06-07 11:50:44
Go没有像Java那样的异常机制,它不能抛出异常,而是使用了 panic和recover机制。一定要记住,应当把它作为最后的手段来使用,也就是说,我们的代码中应当没有,或者很少有panic这样的东西。 ......

一、延迟是什么?
•即延迟( 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")
}

延迟方法(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 ")
}

带参数的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\n", a, b, a+b)
    } else {
        fmt.printf("未延迟执行函数printadd() ,参数a,b分别为%d, %d , 两数之和为:%d\n", a, b, a+b)
    }
}

二、宕机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恐慌了")
}