MST

星途 面试题库

面试题:Go语言中panic与并发的复杂处理

假设在一个有多个goroutine并发执行的Go程序中,其中一个goroutine发生了panic,如何确保整个程序不会崩溃,并且能够妥善处理该panic,同时保证其他正常的goroutine继续运行?请阐述具体的实现思路和关键代码片段。
24.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 在可能发生panicgoroutine中使用defer语句配合recover函数。defer语句会在函数返回或panic发生时执行,recover函数可以捕获panic并使程序恢复正常执行流。
    • 可以通过通道(channel)将捕获到的panic信息传递给主goroutine或其他专门处理错误的goroutine,进行集中处理。这样既不会导致整个程序崩溃,也能让其他正常的goroutine继续运行。
  2. 关键代码片段
package main

import (
    "fmt"
)

func main() {
    // 创建一个通道用于传递panic信息
    panicCh := make(chan interface{})

    // 启动一个goroutine
    go func() {
        defer func() {
            if p := recover(); p != nil {
                panicCh <- p
            }
        }()
        // 模拟可能发生panic的操作
        panic("模拟panic")
    }()

    // 从通道接收panic信息并处理
    go func() {
        for p := range panicCh {
            fmt.Printf("捕获到panic: %v\n", p)
        }
    }()

    // 模拟其他正常goroutine的工作
    go func() {
        for {
            fmt.Println("其他正常goroutine在工作")
        }
    }()

    // 防止主goroutine退出
    select {}
}

在上述代码中:

  • 启动的第一个goroutine中,使用deferrecover捕获panic,并通过panicCh通道将panic信息发送出去。
  • 第二个goroutinepanicCh通道接收panic信息并打印处理。
  • 第三个goroutine模拟其他正常工作的goroutine持续运行。
  • goroutine通过select {}阻塞,防止程序退出。