
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 年 4 月 19 日 via iPhone defer 是倒序执行的,你在首先在第一个 defer 里面 panic 了一个 func,然后再在第二个 defer 拿这个 func。话说,我还是第一次见到 panic function 的 |
2 hyq 2019 年 4 月 19 日 recover() 返回的是一个 interface{} 对 interface{}的类型可以进行一个 type assertion 的操作, 参考 https://golang.org/ref/spec#Type_assertions 这里就是对 err 这个变量,尝试转换成一个 func()string 的函数类型 |
3 jadeity 2019 年 4 月 19 日 断言,我是解析 json 时候学到的。 |