我有一个带接口参数的函数:
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})
}
,第二种方法无法运作
答案 0 :(得分:0)
您有两个选项,功能e
的参数中基本上f
为(*MyError)(nil)
而不是nil
。因此要么断言接口返回类型MyError
,要么使用更多反射来检查它是否为零。
e.(*MyError) == nil
或
reflect.ValueOf(e).IsNil()
可运行示例:https://play.golang.org/p/2KWguSx618
有用的链接: