我对IsValid
函数很好奇,因为在我使用这个函数期间,它从未返回false
。什么时候返回负的结果?
正如doc reflect.IsValid()
所说:
如果v是零值,则返回false。[…]大多数函数和方法从不返回无效值。如果有,它的文档会明确地说明条件。
Value.IsValid()
应该报告reflect.Value
本身是否有效,而不是它包装的值(如果有的话)。
下面所有的例子打印false
。你可以在Go Playground上试试。
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()
:
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())