我最近在阅读singleflight的源代码,我对line 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)
}
为什么在使用通道时使用go panic而不是direct panic?在line 129上使用go docall,在这个方法中出现panic,上层无法恢复,所以go panic应该没有意义吧?
此外,如果有并发请求,在panic之后通道仍然没有被写入,其他goroutine不会也阻塞吗?如果有好心人阅读并回答,我非常感谢~
了解设计含义
1条答案
按热度按时间mzmfm0qo1#
go panic
将导致无法恢复的死机。panic和其后的select
确保panicking goroutine出现在堆栈转储中,因此您可以查看堆栈转储并意识到发生了不应该发生的情况。这只是一种确保您不会无意中从不应恢复的内容中恢复的方法。