Golang--runtime.Goexit() 和 panic

Golang--runtime.Goexit() 和 panic

Go101》:

恐慌和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()不能在最高优先级,那么就很难再配得上runtimeGoexit这两个命名,但是panic被压制,将会掩盖掉业务逻辑上的瑕疵,这是一个引发生产事故的隐患。

原文地址:https://www.cnblogs.com/l1ng14/p/14859089.html