解释一下Go recover的执行时机 ?

Go语言中的recover函数是一个内建函数,它可以被用来捕获和处理panic。recover只在延迟函数(deferred functions)中有效。如果在延迟函数中调用recover,并且在该goroutine中发生了panic,那么recover会捕获panic的值并恢复正常执行。如果在非延迟函数中调用recover,或者没有发生panic,那么recover将返回nil。

以下是一个使用recover的例子:

package main

import "fmt"

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from", r)
        }
    }()

    fmt.Println("This is a normal statement.")

    panic("This is a panic statement.")
}

在这个例子中,我们在deferred函数中调用recover。当panic发生时,recover函数会捕获panic的值(”This is a panic statement.”),打印恢复信息,并恢复程序的正常执行。如果没有这个deferred函数,panic会导致程序终止。