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

我需要肯定地检查一个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 struct

func 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

}


小怪兽爱吃肉
浏览 241回答 2
2回答

德玛西亚99

在 Goerror中并不是什么特别的东西。error只是一个预先声明的接口类型,所以它在反射中没有自己的 Kind。尝试一些东西:errorInterface&nbsp; := reflect.TypeOf((*error)(nil)).Elem()...case reflect.Interface:&nbsp; &nbsp; if typOute.Implements(errorInterface)&nbsp; // it's an error
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go