为了账号安全,请及时绑定邮箱和手机立即绑定

去反思。如何检查reflect.Type是否是错误类型?

去反思。如何检查reflect.Type是否是错误类型?

Go
小怪兽爱吃肉 2021-10-11 13:51:38
我需要肯定地检查一个reflect.Type 是否是一个错误。错误没有反映类型。在 go reflect 中检查类型错误的正式/惯用方式是什么?Go Playground 完整示例//return map of default values, based on each return type of a function// error  => err=nil// bool   => true// struct => new structfunc getDefaultValue(originalFunction interface{}) map[int]reflect.Value {    defaultValues := make(map[int]reflect.Value)    typeOfFunc := reflect.ValueOf(originalFunction).Type()    numOut := typeOfFunc.NumOut() //number of function returns    for i := 0; i < numOut; i++ {        typeOut := typeOfFunc.Out(i) // type of return for index i        switch typeOut.Kind() {        case reflect.Bool:            defaultValues[i] = reflect.ValueOf(true)        case reflect.Struct:            defaultValues[i] = reflect.New(typeOut()).Elem()        // --> How to identify reflect.Type error assuredly, using switch or if...        //case reflect.error: //don't exists        //  var err error = nil        //  defaultValues[i] = reflect.ValueOf(&err).Elem()        default:            //var err error = nil            //defaultValues[i] = reflect.ValueOf(&err).Elem()            fmt.Println("type of return index ", i, " was not identified")        }        fmt.Println("type of return index ", i, typeOut, "kind", typeOut.Kind(), "assign to err ", typeOut.AssignableTo(reflect.TypeOf(errors.New(""))))    }    return defaultValues}
查看完整描述

2 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

在 Goerror中并不是什么特别的东西。error只是一个预先声明的接口类型,所以它在反射中没有自己的 Kind。尝试一些东西:


errorInterface  := reflect.TypeOf((*error)(nil)).Elem()

...

case reflect.Interface:

    if typOute.Implements(errorInterface)  // it's an error


查看完整回答
反对 回复 2021-10-11
  • 2 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信