为什么docall在单次飞行中使用go panic?

zc0qhyus  于 2023-05-11  发布在  Go
关注(0)|答案(1)|浏览(124)

我最近在阅读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不会也阻塞吗?如果有好心人阅读并回答,我非常感谢~
了解设计含义

mzmfm0qo

mzmfm0qo1#

go panic将导致无法恢复的死机。panic和其后的select确保panicking goroutine出现在堆栈转储中,因此您可以查看堆栈转储并意识到发生了不应该发生的情况。
这只是一种确保您不会无意中从不应恢复的内容中恢复的方法。

相关问题