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

时间:2017-05-12 12:24:37

标签: go reflection

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

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})
}

方法2:

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

1 个答案:

答案 0 :(得分:0)

您有两个选项,功能e的参数中基本上f(*MyError)(nil)而不是nil。因此要么断言接口返回类型MyError,要么使用更多反射来检查它是否为零。

e.(*MyError) == nil

reflect.ValueOf(e).IsNil()

可运行示例https://play.golang.org/p/2KWguSx618

有用的链接: