MST

星途 面试题库

面试题:Go并发编程中panic与recover的资源管理挑战

假设在一个使用了goroutine的复杂系统中,多个goroutine共享一些资源,当其中一个goroutine发生panic时,如何通过recover机制确保这些共享资源能被正确清理和释放,避免资源泄漏?请给出详细的实现思路和代码示例。
38.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 在共享资源操作周围使用defer语句,在defer函数中进行资源清理操作,例如关闭文件、释放数据库连接等。
  2. 在可能发生panicgoroutine函数内部使用recover,当recover捕获到panic时,会停止panic的传播,然后执行defer中的清理逻辑。

代码示例

package main

import (
    "fmt"
)

// 模拟共享资源
type SharedResource struct {
    data int
}

// 释放共享资源的函数
func (sr *SharedResource) Release() {
    fmt.Println("Resource released")
}

// goroutine执行的函数
func worker(sr *SharedResource) {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered from panic:", r)
            sr.Release()
        }
    }()

    // 模拟可能发生panic的操作
    panic("Simulated panic")
}

func main() {
    sharedResource := &SharedResource{data: 10}

    go worker(sharedResource)

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

在上述代码中:

  1. SharedResource结构体模拟共享资源,Release方法用于清理资源。
  2. worker函数是goroutine执行的函数,defer语句中使用recover捕获panic,捕获到后执行资源清理操作。
  3. main函数启动goroutine并通过select {}防止主线程退出。