新手请教大家一个语法疑问~ err.(func()string) 这是什么写法什么意思~

2019-04-19 18:26:32 +08:00
 NicolayShi
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")
}
2902 次点击
所在节点    Go 编程语言
3 条回复
Wolther47
2019-04-19 18:38:32 +08:00
defer 是倒序执行的,你在首先在第一个 defer 里面 panic 了一个 func,然后再在第二个 defer 拿这个 func。话说,我还是第一次见到 panic function 的
hyq
2019-04-19 18:38:55 +08:00
recover() 返回的是一个 interface{}
对 interface{}的类型可以进行一个 type assertion 的操作, 参考 https://golang.org/ref/spec#Type_assertions
这里就是对 err 这个变量,尝试转换成一个 func()string 的函数类型
jadeity
2019-04-19 18:42:35 +08:00
断言,我是解析 json 时候学到的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/556855

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX