首先我们要知道panic只会触发当前 Goroutine 的延迟函数调用,我们可以通过如下所示的代码了解该现象: package main import ( "fmt" "time" ) func main() { defer fmt.Println("main") go func() { defer fmt.Println("go func") panic(" ") }() time.Sleep(time.Second) }
当我们执行上面代码时,输出结果是:
通过输出结果,我们发现当发生panic时,它只会执行本协程的已注册的defer语句,而不会执行其他协程的defer语句。
这时我们就得用recover防止程序崩溃了
func main() { defer fmt.Println("main") go func() { defer func() { recover() }()//注意recover得另写在函数中 defer fmt.Println("go func") panic(" ") }() time.Sleep(time.Second) } 输出结果如下