2016-08-18 81 views

回答

6

由於DOC reflect.IsValid()說:

如果v是零值返回FALSE。 [...] 大多數函數和方法永遠不會返回無效值。如果有的話,其文件明確說明條件。

Value.IsValid()應該報告reflect.Value本身是否有效,而不是其包裝的值(如果有的話)。

下面的所有例子打印false。你可以在Go Playground上試試。

最簡單的例子是在主叫IsValid()reflect.Valuezero value(這是一個struct):

fmt.Println(reflect.Value{}.IsValid()) 

的第二簡單的例子是通過當nilreflect.ValueOf()

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

又如:以指針nil開始,在這種情況下不存在「指向」值,指針指向任何地方。試圖獲取使用Value.Elem()結果的尖銳值的reflect.Value在零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()) 

同樣的事情,如果你在打電話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()) 

這樣的例子不勝枚舉...

相關問題