package main
import (
"fmt"
"reflect"
)
func main() {
defer func() {
if err := recover(); err != nil{
fmt.Println("++++")
fmt.Println(err)
f := err.(func()string)
fmt.Println(err,f(),reflect.TypeOf(err).Kind().String())
}else {
fmt.Println("fatal")
}
}()
defer func() {
panic(func() string {
return "defer panic"
})
}()
panic("panic")
}
1
Wolther47 2019-04-19 18:38:32 +08:00 via iPhone
defer 是倒序执行的,你在首先在第一个 defer 里面 panic 了一个 func,然后再在第二个 defer 拿这个 func。话说,我还是第一次见到 panic function 的
|
2
hyq 2019-04-19 18:38:55 +08:00
recover() 返回的是一个 interface{}
对 interface{}的类型可以进行一个 type assertion 的操作, 参考 https://golang.org/ref/spec#Type_assertions 这里就是对 err 这个变量,尝试转换成一个 func()string 的函数类型 |
3
jadeity 2019-04-19 18:42:35 +08:00
断言,我是解析 json 时候学到的。
|