1.主线程中的panic会直接导致所有正在运行的go协程无法执行,还会导致声明在它之后的defer语句无法执行。
package main
import (
"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 main
import (
"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()
}
运行结果: