簡體   English   中英

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

[英]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())

第二個最簡單的例子是傳遞nilreflect.ValueOf()

fmt.Println(reflect.ValueOf(nil).IsValid())

另一個例子:以指針nil ,在這種情況下沒有“尖”值, nil指針指向無處。 試圖獲取reflect.Value使用尖值的Value.Elem()導致零reflect.ValueIsValid()方法將返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM