リフレクションは、Go のオブジェクトの構造と動作を調べるための強力なメカニズムを提供します。これは、基になるタイプに関係なく、インターフェイスのフィールドを走査して分析するために使用できます。このようなシナリオでの一般的なタスクの 1 つは、非ポインター フィールドのアドレスを取得することです。
これを実証するには、次のコードを考えてみましょう。
<code class="go">type Z struct { Id int } type V struct { Id int F Z } type T struct { Id int F V }</code>
関数 InspectStruct を定義して、インターフェイスのフィールドを検索し、その値やアドレスなどの詳細を表示します。この関数は、渡されたインターフェイスの構造をナビゲートするためにリフレクションを利用します。
しかし、元の実装では、トップレベル インターフェイスよりも深い非ポインター フィールドのアドレスを取得するという課題に直面していました。この問題は、インターフェース値 (interface{}) ではなく、reflect.Value を直接受け入れるように関数を変更することで解決されています。
<code class="go">func InspectStructV(val reflect.Value) { ... } func InspectStruct(v interface{}) { InspectStructV(reflect.ValueOf(v)) }</code>
この変更により、実際のリフレクション値を操作できるようになり、以下を取得できるようになります。構造内の深さに関係なく、非ポインター フィールドの正確なアドレス。 InspectStruct の更新された出力には、指定された構造体のすべてのフィールドの正しいアドレスが表示されるようになりました。
Field Name: Id, Field Value: 1, Address: 0x12345678 , Field type: int , Field kind: int Field Name: F, Field Value: {2 {3}}, Address: 0x12345679 , Field type: main.V , Field kind: struct Field Name: Id, Field Value: 2, Address: 0x1234567a , Field type: int , Field kind: int Field Name: F, Field Value: {3}, Address: 0x1234567b , Field type: main.Z , Field kind: struct Field Name: Id, Field Value: 3, Address: 0x1234567c , Field type: int , Field kind: int
reflect.Value を直接使用することで、InspectStruct 関数は、ネストされたフィールドも含めてすべてのフィールドのアドレスを正常に取得できるようになりました。初期インターフェース内。
以上がGo でリフレクションを使用して、入れ子構造内の非ポインター フィールドのアドレスを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。