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

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

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")

}


更多关于Golang Go语言中 新手请教大家一个语法疑问~ err.(func()string) 这是什么写法什么意思~的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

defer 是倒序执行的,你在首先在第一个 defer 里面 panic 了一个 func,然后再在第二个 defer 拿这个 func。话说,我还是第一次见到 panic function 的

更多关于Golang Go语言中 新手请教大家一个语法疑问~ err.(func()string) 这是什么写法什么意思~的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


recover() 返回的是一个 interface{}
对 interface{}的类型可以进行一个 type assertion 的操作, 参考 https://golang.org/ref/spec#Type_assertions
这里就是对 err 这个变量,尝试转换成一个 func()string 的函数类型

断言,我是解析 json 时候学到的。

你好!在Go语言中,err.(func()string) 这种写法实际上是不正确的,它看起来像是尝试对 err 进行类型断言(type assertion)或类型转换,但是格式有误。

首先,类型断言的基本语法是 x.(T),其中 x 是接口类型的变量,T 是断言的目标类型。如果 x 确实存储了 T 类型的值,那么类型断言会成功并返回该值(类型为 T 而不是接口类型)。如果 x 没有存储 T 类型的值,类型断言会失败并引发运行时恐慌(panic)。

然而,func()string 是一个函数类型,表示一个无参数且返回 string 类型值的函数。在Go中,你不能直接将一个变量(特别是错误类型的变量,如 err)断言为函数类型,因为这两者在Go的类型系统中是完全不同的类别。

如果你的目的是检查 err 是否为某种特定类型的错误,并获取该错误类型的特定字段或方法,你应该这样做:

if e, ok := err.(specificErrorType); ok {
    // 使用 e 的特定字段或方法
} else {
    // 处理其他类型的错误
}

其中 specificErrorType 是你想要断言的错误类型。

总之,err.(func()string) 这种写法是错误的,可能是对类型断言的误解。希望这能帮助你更好地理解Go语言中的类型断言和错误处理!

回到顶部