什么时候反映.IsValid返回false?

时间:2016-08-18 06:28:32

标签: go reflection

我对IsValid函数很好奇,因为在我使用这个函数时,它从未返回false。那么它何时会返回否定结果呢?

1 个答案:

答案 0 :(得分:8)

正如文档reflect.IsValid()所说:

  

如果v为零值,则返回false。 [...]    大多数函数和方法永远不会返回无效值。如果有,它的文档明确说明了条件。

Value.IsValid()应该报告reflect.Value本身是否有效,而不是它包装的值(如果有的话)。

以下所有示例都打印false。您可以在Go Playground上试用它们。

最简单的示例是在zero valuereflect.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())

列表继续......