当前位置: 首页 > 面试题库 >

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

马泓
2023-03-14
问题内容

我正在使用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。我也尝试添加一个.Elem()之后reflect.New(reflect.TypeOf(errors.New(""))),但我得到了panic: reflect: function created by MakeFunc using closure returned wrong type: have *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())
}

让我们分解一下。第一步是reflect.Typeerror
reflect.TypeOf((*error)(nil)).Elem()。更简单的方法reflect.TypeOf((error)(nil))不起作用,因为参数的具体值为nil。没有类型,nil也不是我们想要的类型。解决方法是传递一个指针error,然后调用Elem()该类型以获取relfect.Typefor
error

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



 类似资料:
  • 问题内容: 假设您有一个文本文件,例如: 您希望相应地更新相应的对象: 凡是不同种类的枚举。 我想有一个通用的方法来实例化枚举值。也就是说,在运行时使用反射,而无需事先知道对象的枚举类型。 我会想到这样的事情: 问题是:应该有什么呢?给定其String表示形式,甚至可以实例化未知枚举吗? 问题答案: 之后不应该被调用-它返回实例的类 你可以投,避免一般性的问题,因为你已经知道的是

  • 我正试图为一个使用泛型类型参数进行参数化的类施展一些Guava 魔法,但是当我试图通过< code > class . forname(String)方法实例化它时,却得到一个< code > ClassNotFoundException 。 我得到这个例外: "无法找到

  • 本文向大家介绍PHP 反射(Reflection)使用实例,包括了PHP 反射(Reflection)使用实例的使用技巧和注意事项,需要的朋友参考一下 PHP Reflection是用于获取类、扩展、方法、函数、对象、参数、属性的详细信息。 ReflectionClass类获取类相关信息,如获取属性、方法、文档注释等。 ReflectionExtension 类用于获取扩展相关信息  Reflec

  • 我尝试实例化以下Java代码中定义的内部类: 我得到了这个例外: 我错过了什么?

  • 问题内容: 我有一个带有接口参数的函数: 我如何通过它传递一个零值,使其通过检查? 方法1: 方法二: 由于https://golang.org/doc/faq#nil_error,第二种方法不起作用 游乐场:https : //play.golang.org/p/V0bMSPcCKI 问题答案: 使用以下内容创建: 问题中的第一种方法不起作用,因为表达式返回。nil接口值的具体类型为nil。 诀

  • 我使用反射为我的 pojo 类创建了一个实例,如下所示: 当我打印时,我得到了以下字符串: < code > com . hex gen . ro . request . createrequisitionro @ 95c 7850[trans srlno = 实际上,所有值都设置为null,我希望为类中可用的setter设置值。因为setters名称可以随时更改,所以我计划动态设置值,这样就不会