我正在使用 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()
,但我得到了 panic :反射(reflect):MakeFunc 使用闭包创建的函数返回了错误的类型:有 *errors.errorString for error
。我尝试了 .Elem().Elem()
,但遇到了段错误。
我怎样才能得到表示 nil 错误的 reflect.Value?
最佳答案
使用以下内容:
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
第二步是为类型创建一个零值。
关于go - 如何使用 Golang 的 reflect 实例化一个 nil 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51092352/