MST

星途 面试题库

面试题:Go中panic与recover在并发编程里的基础应用

在Go的并发编程场景下,简述panic与recover机制的基本工作原理,并举例说明如何在一个简单的并发函数中使用recover来捕获可能发生的panic。
15.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

panic与recover机制的基本工作原理

  1. panic:当Go语言程序遇到不可恢复的错误时,会引发panicpanic会导致当前函数立即停止执行,并且开始展开(unwind)调用栈,即依次调用调用栈中每个函数的defer语句。如果在展开过程中没有遇到recover,程序最终会崩溃并打印出栈跟踪信息,这些信息有助于定位错误发生的位置。
  2. recoverrecover是一个内置函数,只能在defer函数中使用。当recover被调用时,如果当前的goroutine处于panic状态,它会捕获到panic时传入的参数,停止panic的展开过程,使程序可以继续正常执行。如果当前goroutine没有处于panic状态,recover会返回nil

在简单并发函数中使用recover捕获可能发生的panic示例

package main

import (
    "fmt"
)

func worker() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from panic:", r)
        }
    }()
    // 模拟一个会导致panic的操作
    panic("Something went wrong")
}

func main() {
    go worker()
    // 防止主函数退出太快
    select {}
}

在上述示例中,worker函数内部定义了一个defer函数,其中使用recover来捕获可能发生的panic。当worker函数执行panic("Something went wrong")时,panic发生,程序开始展开调用栈,此时defer函数被执行,recover捕获到panic并打印出恢复信息,程序不会崩溃。main函数中启动了worker的goroutine,并使用select {}防止主函数过早退出,以便观察worker函数中recover的效果。