[英]When does reflect.IsValid return false?
我很好奇IsValid
函數,因為在我使用這個函數時,它從未返回false
。 那么它何時會返回否定結果呢?
正如文檔所reflect.IsValid()
說:
如果v為零值,則返回false。 [...]大多數函數和方法永遠不會返回無效值。 如果有,它的文檔明確說明條件。
Value.IsValid()
應該報告reflect.Value
本身是否有效,而不是它包裝的值(如果有的話)。
以下所有示例均為false
。 您可以在Go Playground上試試。
最簡單的例子是在reflect.Value
(這是一個struct
)的零值上調用IsValid()
):
fmt.Println(reflect.Value{}.IsValid())
第二個最簡單的例子是傳遞nil
以reflect.ValueOf()
:
fmt.Println(reflect.ValueOf(nil).IsValid())
另一個例子:以指針nil
,在這種情況下沒有“尖”值, nil
指針指向無處。 試圖獲取reflect.Value
使用尖值的Value.Elem()
導致零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()
,也是reflect.Value()
:
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())
名單繼續......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.