ホームページ > バックエンド開発 > Golang > Go インターフェイスでアクセス可能なフィールドを検出するためにリフレクションをどのように使用できますか?

Go インターフェイスでアクセス可能なフィールドを検出するためにリフレクションをどのように使用できますか?

DDD
リリース: 2024-12-08 08:14:11
オリジナル
811 人が閲覧しました

How Can Reflection Be Used to Discover Accessible Fields in Go Interfaces?

リフレクションを使用したインターフェイスのフィールド アクセシビリティの発見

インターフェイスの動的な性質により、応答オブジェクト内のアクセス可能なフィールドを確認する方法という問題が生じます。リフレクションは解決策を提供しますが、フィールド名についての事前の知識が必要です。この記事では、リフレクション技術を慎重に適用して、利用可能なすべてのフィールドを取得する方法について説明します。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート