我对IsValid
函数很好奇,因为在我使用这个函数时,它从未返回false
。那么它何时会返回否定结果呢?
答案 0 :(得分:8)
正如文档reflect.IsValid()
所说:
如果v为零值,则返回false。 [...] 大多数函数和方法永远不会返回无效值。如果有,它的文档明确说明了条件。
Value.IsValid()
应该报告reflect.Value
本身是否有效,而不是它包装的值(如果有的话)。
以下所有示例都打印false
。您可以在Go Playground上试用它们。
最简单的示例是在zero value的reflect.Value
上调用IsValid()
(struct
}:
fmt.Println(reflect.Value{}.IsValid())
第二个最简单的例子是将nil
传递给reflect.ValueOf()
:
fmt.Println(reflect.ValueOf(nil).IsValid())
另一个例子:从指针nil
开始,在这种情况下没有"指向"值,nil
指针指向无处。尝试使用Value.Elem()
获取指向值的reflect.Value
会导致reflect.Value
方法返回IsValid()
的归零false
:
var i *int
v := reflect.ValueOf(i)
v2 := v.Elem()
fmt.Println(v2.IsValid())
或者在一行中:
fmt.Println(reflect.ValueOf((*int)(nil)).Elem().IsValid())
如果您在上述reflect.Value()
上致电Value.Indirect()
:
fmt.Println(reflect.Indirect(v).IsValid())
或尝试使用Value.FieldByName()
按名称获取不存在的struct字段:
s := struct{}{}
fmt.Println(reflect.ValueOf(s).FieldByName("").IsValid())
或尝试使用Value.MethodByName()
按名称获取不存在的方法:
fmt.Println(reflect.ValueOf(s).MethodByName("").IsValid())
或尝试使用Value.MapIndex()
m := map[int]int{}
fmt.Println(reflect.ValueOf(m).MapIndex(reflect.ValueOf(3)).IsValid())
列表继续......