gpt4 book ai didi

go - reflect.IsValid 什么时候返回 false?

转载 作者:IT王子 更新时间:2023-10-29 01:25:12 27 4
gpt4 key购买 nike

我对IsValid函数很好奇,因为在我使用这个函数的过程中,它从来没有返回过false。那么它什么时候返回否定结果呢?

最佳答案

作为文档 reflect.IsValid()说:

It returns false if v is the zero Value. [...] Most functions and methods never return an invalid value. If one does, its documentation states the conditions explicitly.

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

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

最简单的示例是在 zero value 上调用 IsValid()reflect.Value (这是一个 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())

如果你调用Value.Indirect()也是一样的在上面的 reflect.Value() 上:

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())

列表还在继续......

关于go - reflect.IsValid 什么时候返回 false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39011295/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com