MST

星途 面试题库

面试题:Go语言中panic恢复机制在并发场景下的应用

在一个包含多个goroutine的Go程序中,如果某个goroutine发生了panic,如何确保整个程序不崩溃,且能正确处理该panic并清理相关资源?请详细说明实现思路并给出示例代码。
37.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,要确保某个goroutine发生panic时整个程序不崩溃,且能正确处理该panic并清理相关资源,可以使用recover函数。recover函数只能在defer函数中使用,用于捕获当前goroutine的panic并恢复正常执行。

实现思路

  1. 在可能发生panic的goroutine中,使用defer语句注册一个函数。
  2. 在这个defer函数中,使用recover函数捕获panic。
  3. 如果捕获到panic,可以进行资源清理操作,并记录错误信息,避免程序崩溃。

示例代码

package main

import (
    "fmt"
)

// cleanup 模拟资源清理函数
func cleanup() {
    fmt.Println("Cleaning up resources...")
}

// worker 模拟工作的goroutine
func worker() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("Recovered from panic: %v\n", r)
            cleanup()
        }
    }()

    // 模拟可能发生panic的操作
    panic("Something went wrong!")
}

func main() {
    go worker()

    // 防止主程序退出
    select {}
}

在上述示例代码中:

  1. worker函数是一个模拟工作的goroutine。
  2. worker函数内部,通过defer注册了一个匿名函数,在这个匿名函数中使用recover捕获可能发生的panic。
  3. 如果捕获到panic,打印出panic信息,并调用cleanup函数清理资源。
  4. main函数中启动worker这个goroutine,并使用select {}防止主程序退出。这样,即使worker goroutine发生panic,整个程序也不会崩溃,并且能正确处理panic并清理相关资源。