什么时候反映.返回false



我对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():

通过不存在的键从map中获取值
m := map[int]int{}
fmt.Println(reflect.ValueOf(m).MapIndex(reflect.ValueOf(3)).IsValid())

相关内容

  • 没有找到相关文章

最新更新