リフレクションを使用したインターフェイスのフィールド アクセシビリティの発見
インターフェイスの動的な性質により、応答オブジェクト内のアクセス可能なフィールドを確認する方法という問題が生じます。リフレクションは解決策を提供しますが、フィールド名についての事前の知識が必要です。この記事では、リフレクション技術を慎重に適用して、利用可能なすべてのフィールドを取得する方法について説明します。
reflect.TypeOf() の導入により、reflect を取得する道が開かれます。 記述子を入力します。この記述子により、インターフェイス内で保持される動的値に関連付けられたフィールドの列挙が可能になります。
次の例を考えてみましょう:
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}
各フィールドは、 reflect.StructField 構造体。フィールド名などの詳細を提供します。
フィールド値を取得するには、reflect.ValueOf() を使用して reflect.Value。この値により、Field() または 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 でのリフレクションの包括的なガイドについては、ブログ投稿「The Laws」を参照してください。反射の。」以上がGo インターフェイスでアクセス可能なフィールドを検出するためにリフレクションをどのように使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。