【发布时间】:2017-10-11 18:33:56
【问题描述】:
我有一个带有接口参数的函数:
func f(e error) {
if e == nil {
fmt.Println("YEY! NIL") // how to get here?
} else {
fmt.Println("NOT NIL :(")
}
}
我如何通过reflect 向它传递一个零值,以便它通过== nil 检查?
方法一:
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,第二种方法不起作用
【问题讨论】:
-
为什么 `rf := reflect.ValueOf(f)` 是一个要求?
&MyError{}无论如何都不是零
标签: go reflection