MST

星途 面试题库

面试题:Go 中 panic 与 recover 在并发场景下的处理

在 Go 语言的并发编程中,多个 goroutine 同时运行。假设存在一个场景,其中一个 goroutine 可能会发生 panic,你如何确保这个 panic 不会导致整个程序崩溃,并且其他 goroutine 能够继续正常运行?请编写代码示例来展示你的解决方案。
45.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,可以使用recover函数来捕获panic,防止程序崩溃。以下是示例代码:

package main

import (
    "fmt"
    "time"
)

func worker1() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("worker1 caught panic:", r)
        }
    }()
    // 模拟可能发生panic的操作
    panic("worker1 panic")
}

func worker2() {
    for i := 0; i < 3; i++ {
        fmt.Println("worker2 is running:", i)
        time.Sleep(time.Second)
    }
}

func main() {
    go worker1()
    go worker2()

    time.Sleep(5 * time.Second)
    fmt.Println("main function exiting")
}

在上述代码中:

  1. worker1函数使用defer语句配合recover函数来捕获可能发生的panic。如果发生panicrecover会返回panic的值,这样就可以在defer函数中处理这个panic,而不会导致整个程序崩溃。
  2. worker2函数是一个正常运行的goroutine,它不受worker1panic的影响,继续正常执行。
  3. main函数中,启动了worker1worker2两个goroutine,并等待一段时间,确保goroutine有足够的时间运行。