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

DLo*_*pes 5 reflection metaprogramming go

我需要确定检查一下reflect.Type是否是一个错误.

没有反映错误的种类.go反映中检查类型错误的正式/惯用方法是什么?

去游乐场完整的例子

//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
}
Run Code Online (Sandbox Code Playgroud)

Vol*_*ker 11

在Go error中并不特别.error只是一个预先声明的接口类型,因此它没有自己的Kind in reflect.尝试一下:

errorInterface  := reflect.TypeOf((*error)(nil)).Elem()
...
case reflect.Interface:
    if typOute.Implements(errorInterface)  // it's an error
Run Code Online (Sandbox Code Playgroud)

  • nil是字面意义上的nil。sometype(nil)是nil到nil sometype的类型转换。`(* error)(nil)`产生nil * error,我们可以通过TypeOf来获取类型。返回错误界面是通过Elem完成的。 (2认同)