返回

Go Quiz:从Go面试题看recover注意事项(第一篇)

后端

Go Quiz:从Go面试题看recover注意事项(第一篇)

在Go语言中,recover函数是一个非常重要的错误处理工具,它可以捕获到panic并恢复程序的执行。在Go面试中,recover函数也是经常被问到的一个知识点。

本篇Go Quiz系列文章将重点考察recover函数在什么情况下可以捕获到panic。通过对面试题的分析,帮助读者深入理解recover函数的使用场景和注意事项。

面试题:

以下代码中,recover函数能否捕获到panic?

func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()

    panic("something wrong")
}

答案:

可以。

解析:

在Go语言中,recover函数只能捕获到在它所在的goroutine中发生的panic。在本例中,panic是在main函数中发生的,而recover函数也在main函数中,因此recover函数可以捕获到panic。

需要注意的是,如果panic发生在其他goroutine中,那么recover函数是无法捕获到panic的。例如,以下代码中的recover函数就无法捕获到panic:

func main() {
    go func() {
        panic("something wrong")
    }()

    defer func() {
        if err := recover(); err != nil {
            fmt.Println(err)
        }
    }()
}

recover函数的使用注意事项:

  1. recover函数只能捕获到在它所在的goroutine中发生的panic。
  2. recover函数只能捕获到一次panic。如果在一个goroutine中发生多次panic,那么recover函数只会捕获到第一次panic。
  3. recover函数只能捕获到panic值,而无法捕获到panic的原因。
  4. recover函数不能用于捕获系统错误。系统错误是指由Go语言运行时发生的错误,例如内存分配错误、堆栈溢出等。

总结:

recover函数是一个非常重要的错误处理工具,它可以捕获到panic并恢复程序的执行。但是在使用recover函数时,需要注意上述注意事项,以避免出现问题。