すべてのインターフェイス フィールドへのアクセス
Go では、インターフェイスは、共有の機能セットを備えたさまざまな型のメソッドにアクセスする方法を提供します。ただし、インターフェイスを操作する場合、その構造についての事前知識がなければ、利用可能なフィールドを判断するのは困難な場合があります。
リフレクションの使用
この課題を克服するには、次のようにします。 Go のリフレクション パッケージを利用すると、オブジェクトの基礎となる構造を検査できます。 reflect.TypeOf() 関数を使用すると、型記述子を取得でき、そこからインターフェイスの値の個々のフィールドにアクセスできます。
例
の場合たとえば、次のコードを考えてみましょう。
type Point struct { X int Y int } var reply interface{} = Point{1, 2} t := reflect.TypeOf(reply)
ここで、reflect.TypeOf() は、次の Reflect.Type 記述子を返します。ポイント構造体。 NumField() メソッドを使用すると、構造体のフィールドの数を確認できます。各フィールド インデックス (i) の Field(i) メソッドにアクセスすると、reflect.StructField value:
for i := 0; i < t.NumField(); i++ { fmt.Printf("%+v\n", t.Field(i)) }
Output:
{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 Values
フィールド値が必要な場合は、reflect.ValueOf() 関数を利用できます。インターフェイスからreflect.Valueを取得し、Value.Field()またはValue.FieldByName()を使用して特定のフィールド値にアクセスするには:v := reflect.ValueOf(reply) for i := 0; i < v.NumField(); i++ { fmt.Println(v.Field(i)) }
1 2
ポインターの処理
インターフェースは構造体へのポインターをラップする場合があることに注意してください。このような場合は、Type.Elem() または Value.Elem() を使用して、基になる型または値に移動します。型が不明な場合は、Type.Kind() または Value.Kind() を使用して結果をreflect.Ptr.と比較して確認してください。
以上がリフレクションを使用して Go でインターフェイスのすべてのフィールドにアクセスするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。