一尘不染

Golang通过反射将nil值作为接口传递

go

我有一个带有接口参数的函数:

func f(e error) {
    if e == nil {
        fmt.Println("YEY! NIL") // how to get here?
    } else {
        fmt.Println("NOT NIL :(")
    }
}

我如何通过它传递一个零值reflect,使其通过== nil检查?

方法1:

func main() {
    rf := reflect.ValueOf(f)

    nilArg := reflect.Zero(reflect.TypeOf((error)(nil))) // panic: reflect: Zero(nil)

    rf.Call([]reflect.Value{nilArg})
}

方法二:

type MyError struct{}
func (e MyError) Error() string {
    return ""
}

func main() {
    rf := reflect.ValueOf(f)
    nilArg := reflect.Zero(reflect.TypeOf(&MyError{})) // NOT NIL :(

    rf.Call([]reflect.Value{nilArg})
}

由于https://golang.org/doc/faq#nil_error,第二种方法不起作用

游乐场:https :
//play.golang.org/p/V0bMSPcCKI


阅读 283

收藏
2020-07-02

共1个答案

一尘不染

使用以下内容创建nilArg

nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())

问题中的第一种方法不起作用,因为表达式reflect.TypeOf((error)(nil))返回nil。nil接口值的具体类型为nil。

诀窍是将非接口值传递到reflect.TypeOf()并使用反射方法reflect.Type从那里获取所需值。在这个答案,我通过*errorreflect.TypeOf(),并呼吁Elem对结果得到reflect.Typeerror

游乐场的例子

2020-07-02