MST

星途 面试题库

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

在 Go 的并发编程中,多个 goroutine 同时运行。假设某个 goroutine 执行过程中发生 panic,如何在主 goroutine 中捕获这个 panic 并进行相应处理,以避免整个程序崩溃?请给出实现思路和示例代码。
23.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 在每个可能发生 panicgoroutine 中使用 defer 关键字配合 recover 函数。defer 会在函数返回或 panic 时执行,recover 函数用于捕获 panic 并返回 panic 的值。
  2. 捕获到 panic 后,通过通道(channel)将 panic 的值传递给主 goroutine 进行处理。

示例代码

package main

import (
    "fmt"
)

func main() {
    panicChan := make(chan interface{})

    go func() {
        defer func() {
            if r := recover(); r != nil {
                panicChan <- r
            }
        }()
        // 模拟可能发生 panic 的操作
        panic("发生了一个 panic")
    }()

    select {
    case p := <-panicChan:
        fmt.Printf("主 goroutine 捕获到 panic: %v\n", p)
    }
}

在上述代码中:

  1. 首先创建了一个无缓冲通道 panicChan 用于传递 panic 值。
  2. goroutine 内部使用 defer 函数配合 recover 捕获 panic,如果捕获到 panic,则将其发送到 panicChan 通道。
  3. 在主 goroutine 中通过 select 语句从 panicChan 通道接收 panic 值并进行处理。