去反映。如何判断reflect.Type是否为错误类型?
Go reflect. How to check whether reflect.Type is an error type?
我需要确定地检查reflect.Type是否是一个错误。
错误没有反映类型。 formal/idiomatic 在 go reflect 中检查类型错误的方式是什么?
//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
}
在 Go 中 error
并不是什么特别的东西。 error
只是一个预先声明的接口类型,所以它在反射中没有自己的种类。
尝试一下:
errorInterface := reflect.TypeOf((*error)(nil)).Elem()
...
case reflect.Interface:
if typOute.Implements(errorInterface) // it's an error
您也可以只使用类型的名称。
创建反射类型的新值并进行类型断言:
...
default:
typeOutValue := reflect.New(typeOut)
if _, ok := typeOutValue.Interface().(*error); ok {
defaultValues[i] = typeOutValue.Elem()
} else {
fmt.Println("type of return index ", i, " was not identified")
}
}
或switch
其接口类型:
...
default:
typeOutValue := reflect.New(typeOut)
switch typeOutValue.Interface().(type) {
case *error:
defaultValues[i] = typeOutValue.Elem()
default:
fmt.Println("type of return index ", i, " was not identified")
}
通过这种方式,您还可以处理您可以(并且想要)特别注意的任何其他接口类型,使用更惯用的 Go 代码并减少对(或至少调用)reflect
包(开销等等)。
我需要确定地检查reflect.Type是否是一个错误。
错误没有反映类型。 formal/idiomatic 在 go reflect 中检查类型错误的方式是什么?
//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
}
在 Go 中 error
并不是什么特别的东西。 error
只是一个预先声明的接口类型,所以它在反射中没有自己的种类。
尝试一下:
errorInterface := reflect.TypeOf((*error)(nil)).Elem()
...
case reflect.Interface:
if typOute.Implements(errorInterface) // it's an error
您也可以只使用类型的名称。
创建反射类型的新值并进行类型断言:
...
default:
typeOutValue := reflect.New(typeOut)
if _, ok := typeOutValue.Interface().(*error); ok {
defaultValues[i] = typeOutValue.Elem()
} else {
fmt.Println("type of return index ", i, " was not identified")
}
}
或switch
其接口类型:
...
default:
typeOutValue := reflect.New(typeOut)
switch typeOutValue.Interface().(type) {
case *error:
defaultValues[i] = typeOutValue.Elem()
default:
fmt.Println("type of return index ", i, " was not identified")
}
通过这种方式,您还可以处理您可以(并且想要)特别注意的任何其他接口类型,使用更惯用的 Go 代码并减少对(或至少调用)reflect
包(开销等等)。