fatal error: all goroutines are asleep - deadlock!deadlockrecover
recover()os.Exit(0)deferfatal errordefer
func main() {
defer func() {
if err := recover(); err != nil {
fmt.Println("在for循环中多次调用调用 t1 := <-timer1.C 引发异常:", err)
}
}()
timer1 := time.NewTimer(time.Millisecond)
for i := 0; i < 2; i++ {
t1 := <-timer1.C // 第二次执行到这里程序会异常中断,不会被defer捕捉,
// 因为严格来说这不是异常,而是 fatal error: all goroutines are asleep - deadlock!
// 因为 timer1.C 是一个 <-chan Time 类型的管道,该管道在触发一次后会被置为nil,此时读取它的值会发生阻塞
// 所以会发生deadlock
// 如果是多协程的话, 如果主协程要等待该协程的话,也会发生deadlock,否则只是该协程不会执行完成,不会引发异常
// 综上, defer不能捕捉该 "异常" , 因为这不是异常,而是程序逻辑错误
fmt.Printf("t1:%v\n", t1)
}
}