2016-08-18 3 views

答えて

6

は言う:

vがゼロ値である場合にはfalseを返します。 [...] ほとんどの関数とメソッドは無効な値を返しません。もしそうであれば、その文書は条件を明示的に述べる。

Value.IsValid()は(もしあれば)、それはラップ値、reflect.Value自体が有効であるかどうかではない報告することになっています。

以下のすべての例は、印刷falseです。あなたはGo Playgroundでそれらを試すことができます。

最も簡単な例は、(structある)reflect.Valuezero valueIsValid()を呼び出している:

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

reflect.ValueOf()nilを通過するときに第2の最も簡単な例である:

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

別の例:ポインタがnilで始まります。この場合は、「指し示された」値はありません。nilポインターはどこにも指していません。そのIsValid()方法ゼロreflect.ValueValue.Elem()結果を用いて尖った値のreflect.Valueを取得しようとすると、falseを返します。

var i *int 
v := reflect.ValueOf(i) 
v2 := v.Elem() 
fmt.Println(v2.IsValid()) 

または1行で:

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

リスト...

に行きます
関連する問題