[英]How can I instantiate a nil error using Golang's reflect?
我正在使用reflect.MakeFunc编写函数。 该函数可以返回错误。 成功时,我希望它为错误类型的返回值返回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()
之后添加一个.Elem()
,但我感到panic: reflect: function created by MakeFunc using closure returned wrong type: have *errors.errorString for error
。 我尝试了.Elem().Elem()
,但出现了段错误。
如何获得表示nil错误的reflect.Value?
我找到了一种方法reflect.ValueOf(f).Call(nil)
。 也许有更好的选择。
使用以下内容:
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
。
第二步是为类型创建一个零值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.