如果导入的库产生一个可能会出现恐慌的 goroutine 怎么办?在这种情况下,开发人员无法阻止程序退出。
就像这段代码一样,调用一个带有延迟恢复的坏库并没有帮助,因为该库正在生成一个发生恐慌的 goroutine,并且它无法被 main 的恢复捕获。
我是否理解正确的是,唯一的补救措施是在为项目选择依赖项时非常小心,并希望作者不要做类似的事情?
package main
import (
"fmt"
"time"
)
func main() {
defer func() {
r := recover()
if r != nil {
fmt.Println("panic caught")
}
}()
badLibrary()
}
func badLibrary() {
go recklessFunction()
time.Sleep(time.Second)
}
func recklessFunction() {
panic("something went wrong")
}
Run Code Online (Sandbox Code Playgroud)
你是对的,对此你无能为力。os.Exit()例如,如果依赖项调用,您也不能。
无论如何,将 goroutine 作为库启动通常是不好的做法,让客户端(库的用户)选择是否需要并发执行(goroutine),添加关键字go是微不足道的。当然也有例外。