我正在panic/recoverGolang 中测试。这个简单的程序按预期工作:
package main
import "fmt"
func printRecover() {
r := recover()
fmt.Println("Recovered:", r)
}
func main() {
defer printRecover()
panic("OMG!")
}
Run Code Online (Sandbox Code Playgroud)
输出:
Recovered: OMG!
Run Code Online (Sandbox Code Playgroud)
但是,如果我将该函数包装printRecover()在一个更大的延迟函数中:
package main
import "fmt"
func printRecover() {
r := recover()
fmt.Println("Recovered:", r)
}
func main() {
defer func() {
printRecover()
}()
panic("OMG!")
}
Run Code Online (Sandbox Code Playgroud)
它不会恢复并让恐慌持续下去:
Recovered: <nil>
panic: OMG!
goroutine 1 [running]:
main.main()
/tmp/sandbox898315096/main.go:15 +0x60
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下区别吗?