go - 如何使用 Golang 的 reflect 实例化一个 nil 错误?

标签 go reflection

我正在使用 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)) 不起作用,因为参数的具体值为 nilnil 没有类型,而且它也不是我们想要的类型。解决方法是传递一个指向 error 的指针,然后对该类型调用 Elem() 以获得 error 的 relfect.Type

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

关于go - 如何使用 Golang 的 reflect 实例化一个 nil 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51092352/

相关文章:

go - 如何在uber/zap记录器中动态更改日志级别

c# - 如何在没有 setter 的情况下设置属性值

c# - 如何在被调用的方法中获取事件名称

java - 使用反射的静态方法

c# - 在匿名方法中使用 MethodInfo.GetCurrentMethod()

java - 泛型 - 动态创建数据

go - golang中指针内容的差异

go - play.golang.org 如何自动管理导入?

Golang 嵌入式结构

go - 如何将请求主体解码/解码为 Golang 结构和结构 slice ?