举个例子 比如这种情况 主进程会直接崩溃 看不到这个ok的打印
package main import ( "log" "time" ) func Panic() { panic(1) } func main() { go Panic() time.Sleep(1 * time.Second) log.Println("OK") }
这时使用这个函数
在panic之后主进程就不会崩溃了
可以看到这个ok打印出来
func NewRoutine(f func()) { go func() { defer func() { // Recover from panic. if err := recover(); err != nil { stack := string(debug.Stack()) log.Println(err) log.Println(stack) } }() f() }() }
func Panic() { panic(1) }
func main() { NewRoutine(Panic) time.Sleep(1 * time.Second) log.Println("OK") }
因为这个函数里使用了recover 可以使panic的函数不会立刻返回 而是先defer 再返回
这样就避免了主进程崩溃的情况