MST

星途 面试题库

面试题:Go中如何通过defer和recover提高并发程序健壮性

在Go语言的并发程序中,简要说明如何使用defer和recover机制来捕获和处理goroutine中未预期的恐慌(panic),以增强程序的健壮性,并给出一个简单示例。
39.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 使用deferrecover捕获和处理panic的原理
    • defer语句用于延迟函数的执行,通常在函数结束时执行。在goroutine中,可以使用defer来注册一个函数,这个函数将在goroutine结束时执行。
    • recover函数用于在defer函数中捕获panic。当panic发生时,程序的正常执行流程被中断,但是如果在defer函数中调用recover,可以捕获到这个panic并恢复程序的正常执行。
  2. 示例代码
package main

import (
    "fmt"
)

func worker() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from panic:", r)
        }
    }()
    // 模拟一个可能导致panic的操作
    panic("This is a test panic")
}

func main() {
    go worker()
    // 防止主程序退出太快
    select {}
}

在上述代码中:

  • worker函数中使用defer注册了一个匿名函数。在这个匿名函数中,使用recover来捕获可能发生的panic。如果捕获到panic,会打印出恢复的信息。
  • main函数中启动了worker这个goroutine,并使用select {}来防止主程序过早退出,以便观察到worker函数中panic被捕获的效果。