MST
星途 面试题库

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

在Go语言的并发编程中,假设有多个goroutine,其中一个goroutine执行过程中发生了panic。请描述如何在主goroutine中捕获这个panic,并确保其他goroutine能正常结束或得到相应处理,给出具体实现代码。
12.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

func worker(wg *sync.WaitGroup) {
    defer wg.Done()
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in worker:", r)
        }
    }()
    // 模拟可能发生panic的操作
    panic("Some error occurred")
}

func main() {
    var wg sync.WaitGroup
    numWorkers := 3

    for i := 0; i < numWorkers; i++ {
        wg.Add(1)
        go worker(&wg)
    }

    go func() {
        wg.Wait()
        fmt.Println("All workers have finished")
    }()

    // 模拟主goroutine等待一段时间
    select {}
}
  1. worker函数
    • defer wg.Done()用于通知WaitGroup该goroutine已完成。
    • 使用deferrecover来捕获可能发生的panic。如果发生panicrecover会捕获到,并在worker内部处理,不会影响其他goroutine。
  2. main函数
    • 使用WaitGroup来等待所有worker goroutine完成。
    • 在一个单独的goroutine中调用wg.Wait(),并在其完成后打印消息,表明所有worker已完成。
    • select {}是为了防止主goroutine退出,让程序持续运行直到所有worker完成。这样就确保了在主goroutine中不会因为某个workerpanic而异常退出,同时其他goroutine也能正常结束或得到相应处理。