Golang--runtime.Goexit() 和 panic
《Go
101》:
恐慌和Goexit信号是互不干扰的。 换句话说,一个尚未被恢复的恐慌不会导 致一个Goexit信号被取消;一个Goexit信号也不会压制遮挡一个尚未被恢复的恐慌。
但是目前Go 1.16.5
版本中,确实以下状态:
package main
import "runtime"
func f(){
defer runtime.Goexit()
panic(1)
}
func main() {
go f()
}
上述例子将会被安全退出。
相关issue
也在2019
年被人提出,还在讨论内。
https://github.com/golang/go/issues/35378
下面的例子在Go 1.14
之前将会是永不退出的状态。
package main
import "runtime"
func f() {
go func(){
defer func(){
recover()
}()
defer panic(1)
runtime.Goexit()
}()
}
func main(){
f()
runtime.Gosched()
}
在Go 1.14
之后的编译器修复了相关问题。
https://github.com/golang/go/issues/29226
以上参考自《Go
101》
以后修复的方向围绕着,怎么处理好runtime.Goexit()
和panic
之间的关系。
两者之间的优先级首先得到确认,如果runtime.Goexit()
不能在最高优先级,那么就很难再配得上runtime
和Goexit
这两个命名,但是panic
被压制,将会掩盖掉业务逻辑上的瑕疵,这是一个引发生产事故的隐患。