我正在使用反射编写一个函数。马克富克。该函数可能会返回错误。当它成功时,我希望它为其错误类型的返回值返回 nil。如何使用反射来做到这一点?目前我有这个:
package main
import (
"fmt"
"reflect"
"errors"
)
func main() {
fmt.Println("Hello, playground")
f := func() error {return nil}
fn := reflect.MakeFunc(reflect.TypeOf(f), func(args []reflect.Value) []reflect.Value {
return []reflect.Value{reflect.New(reflect.TypeOf(errors.New("")))}
}).Interface().(func() error)
fmt.Printf("err: %v", fn())
}
我得到panic: reflect: function created by MakeFunc using closure returned wrong type: have **errors.errorString for error
.我也尝试在reflect.New(reflect.TypeOf(errors.New("")))
后添加一个.Elem()
,但我得到了panic: reflect: function created by MakeFunc using closure returned wrong type: have *errors.errorString for error
.我尝试了.Elem().Elem()
,但我得到了一个分段错误。
我怎样才能得到反映。表示零错误的值?
使用以下命令:
var nilError = reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
func main() {
fmt.Println("Hello, playground")
f := func() error { return nil }
fn := reflect.MakeFunc(reflect.TypeOf(f), func(args []reflect.Value) []reflect.Value {
return []reflect.Value{nilError}
}).Interface().(func() error)
fmt.Printf("err: %v", fn())
}
让我们分解一下。第一步是获得error
的reflect.Type
:reflect.TypeOf((*error)(nil)).Elem()
。 更简单的reflect.TypeOf((error)(nil))
不起作用,因为参数的具体值是nil
。 没有nil
的类型,无论如何它都不是我们想要的类型。 解决方法是传递指向error
的指针,然后在类型上调用Elem()
以获取error
的relfect.Type
。
第二步是为类型创建一个零值。
我找到了一种方法 -reflect.ValueOf(f).Call(nil)
.也许有一个更好的。