応答オブジェクトまたはインターフェイスを処理する場合、使用可能なフィールドを識別することが必要になる場合があります。リフレクションはオプションですが、フィールド名を事前に知っておく必要があります。この記事では、リフレクションを使用して、インターフェイスからアクセスできるすべてのフィールドを取得する方法について説明します。
型記述子を取得するには、reflect.TypeOf() 関数を使用します。 。この記述子は、インターフェイス内に格納されている動的値のフィールドをリストするために使用できます。
次の例を考えてみましょう:
type Point struct { X int Y int } var reply interface{} = Point{1, 2} t := reflect.TypeOf(reply) for i := 0; i < t.NumField(); i++ { fmt.Printf("%+v\n", t.Field(i)) }
出力:
{Name:X PkgPath: Type:int Tag: Offset:0 Index:[0] Anonymous:false} {Name:Y PkgPath: Type:int Tag: Offset:4 Index:[1] Anonymous:false}
各タイプ.Field() 呼び出しは、フィールドなどの詳細を含む Reflect.StructField を返します。 name.
フィールド値を取得するには、reflect.ValueOf() を使用して、reflect.Value を取得します。次に、Value.Field() または Value.FieldByName():
v := reflect.ValueOf(reply) for i := 0; i < v.NumField(); i++ { fmt.Println(v.Field(i)) }
Output:
1 2
多くの場合、次のポインターを使用できます。構造はインターフェイスでラップされます。指定された型または値に移動するには、Type.Elem() および Value.Elem() を使用します。
t := reflect.TypeOf(reply).Elem() v := reflect.ValueOf(reply).Elem()
リフレクションを使用すると、明示的に指定されているかどうかに関係なく、インターフェイスからすべてのフィールドを取得できます。知られています。これは、任意のデータ構造を検査する強力な方法を提供します。 Go のリフレクションの詳細については、ブログ投稿「リフレクションの法則」を参照してください。
以上がGo Reflection を使用してインターフェイスからフィールドを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。