1.主线程中的panic会直接导致所有正在运行的go协程无法执行,还会导致声明在它之后的defer语句无法执行。
package mainimport ("fmt""time"
)func main() {defer fmt.Println("defer1") //声明在panic之前的defer会执行go func() {defer fmt.Println("other running goroutine's defer") //主线程发生panic后,会直接终止程序,导致正在运行的goroutine中的defer无法执行time.Sleep(10 * time.Second) //模拟正在运行的goroutine}()panic("An panic has occurred")defer fmt.Println("defer2") //声明在panic之后的defer不会被执行
}
运行结果:
2.无论是主线程的panic还是协程中的panic都会导致整个程序终止。但是只有发生panic的协程中的defer语句可以执行。
package mainimport ("fmt""sync""time"
)func main() {wg := sync.WaitGroup{}wg.Add(2)go func() {defer wg.Done()defer fmt.Println("other running goroutine's defer") //正在运行的goroutine中的defer语句time.Sleep(3 * time.Second) //模拟正在运行的goroutine}()go func() {defer wg.Done()defer fmt.Println("panic's goroutine defer") //声明在panic之前的defer会执行panic("An panic has occurred")}()defer fmt.Println("main's goroutine defer") //主线程中的defer语句wg.Wait()
}
运行结果: