登录
首页 >  Golang >  Go问答

为什么 singleflight 在 docall 中使用 gopanic?

来源:stackoverflow

时间:2024-03-20 11:15:33 164浏览 收藏

**singleflight 中使用 gopanic 的原因** 在 singleflight 源代码中,当通道不为空时,第 158 行使用 `gopanic` 引发无法恢复的恐慌。这确保了恐慌的 goroutine 出现在堆栈转储中,即使上层无法恢复。此机制旨在防止意外从不应恢复的内容中恢复,帮助开发人员识别和解决问题。

问题内容

我最近在读singleflight源代码,对第158行感到困惑。

if len(c.chans) > 0 {
    go panic(e)
    select {} // Keep this goroutine around so that it will appear in the crash dump.
} else {
    panic(e)
}

为什么在使用channel时使用gopanic而不是直接panic?第129行使用go docall,在这个方法中panic,上层无法恢复,所以go panic应该没有意义了吧?

此外,如果有并发请求,panic后通道仍然没有写入,其他goroutine不也会阻塞吗?如果有好心人阅读并解答,非常感激~

了解设计含义


正确答案


gopanic 将导致无法恢复的恐慌。恐慌和 select 之后确保恐慌的 goroutine 出现在堆栈转储中,因此您可以查看堆栈转储并意识到发生了不应该发生的情况。

这只是确保您不会无意中从不应恢复的内容中恢复的一种方法。

到这里,我们也就讲完了《为什么 singleflight 在 docall 中使用 gopanic?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>