如何使用 Golang 的反射实例化 nil 错误?



我正在使用反射编写一个函数。马克富克。该函数可能会返回错误。当它成功时,我希望它为其错误类型的返回值返回 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())
}

让我们分解一下。第一步是获得errorreflect.Typereflect.TypeOf((*error)(nil)).Elem()。 更简单的reflect.TypeOf((error)(nil))不起作用,因为参数的具体值是nil。 没有nil的类型,无论如何它都不是我们想要的类型。 解决方法是传递指向error的指针,然后在类型上调用Elem()以获取errorrelfect.Type

第二步是为类型创建一个零值。

我找到了一种方法 -reflect.ValueOf(f).Call(nil).也许有一个更好的。

最新更新