面试题答案
一键面试实现思路
- 在共享资源操作周围使用
defer
语句,在defer
函数中进行资源清理操作,例如关闭文件、释放数据库连接等。 - 在可能发生
panic
的goroutine
函数内部使用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 {}
}
在上述代码中:
SharedResource
结构体模拟共享资源,Release
方法用于清理资源。worker
函数是goroutine
执行的函数,defer
语句中使用recover
捕获panic
,捕获到后执行资源清理操作。main
函数启动goroutine
并通过select {}
防止主线程退出。