我有一个带有接口参数的函数:
func f(e error) { if e == nil { fmt.Println("YEY! NIL") // how to get here? } else { fmt.Println("NOT NIL :(") } }
我如何通过它传递一个零值reflect,使其通过== 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
使用以下内容创建nilArg:
nilArg
nilArg := reflect.Zero(reflect.TypeOf((*error)(nil)).Elem())
问题中的第一种方法不起作用,因为表达式reflect.TypeOf((error)(nil))返回nil。nil接口值的具体类型为nil。
reflect.TypeOf((error)(nil))
nil
诀窍是将非接口值传递到reflect.TypeOf()并使用反射方法reflect.Type从那里获取所需值。在这个答案,我通过*error到reflect.TypeOf(),并呼吁Elem对结果得到reflect.Type的error。
reflect.TypeOf()
reflect.Type
*error
Elem
error
游乐场的例子