MST

星途 面试题库

面试题:Go中panic和recover在并发场景下的应用

在一个包含多个goroutine的Go程序中,假设某个goroutine发生了panic,如何使用recover来确保整个程序不会崩溃,并且能够处理该goroutine的异常情况?请编写相关代码示例,要求展示如何在主goroutine中捕获其他goroutine的panic并进行适当处理。
30.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "time"
)

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

func main() {
    go worker()
    // 等待一段时间,确保 worker goroutine 有机会执行
    time.Sleep(2 * time.Second)
    fmt.Println("Main goroutine continues running")
}

上述代码中:

  1. worker 函数是一个独立的 goroutine,它内部使用 defer 语句和 recover 函数来捕获可能发生的 panic
  2. main 函数中启动 worker goroutine,并通过 time.Sleep 等待一段时间,确保 worker 有机会执行。这样即使 worker 发生 panicmain 函数也不会崩溃,并且 worker 中的 panic 会被捕获并处理。