リフレクションを使用して値へのポインターを取得する
インターフェイスのフィールドを検査するには、Go でリフレクションを使用する必要があります。ただし、非ポインター フィールドのアドレスを取得しようとすると、問題が発生します。この記事では、これらの課題に対処し、解決策を提供します。
提供されたコード サンプルでは、InspectStruct という名前の関数が指定された構造体を走査し、各フィールドの詳細を出力します。ほとんどのフィールドは考慮されますが、構造内の上位レベルに埋め込まれた非ポインター フィールドは、「アドレス指定できない」結果をもたらします。
解決策
問題は、 Reflect.Value.Interface() メソッドの使用法。非ポインタ フィールドのアドレスを取得するには、interface{} の代わりにreflect.Value を InspectStruct 関数に渡すことをお勧めします。以下の修正されたコードには、この変更が組み込まれています。
<code class="go">func InspectStructV(val reflect.Value) { // ... (remaining code is identical) } func InspectStruct(v interface{}) { InspectStructV(reflect.ValueOf(v)) }</code>
この変更により、InspectStruct 関数は意図したとおりに動作し、深さやポインターの状態に関係なく、構造内のすべてのフィールドのアドレスが得られます。これは、更新されたテスト結果で確認できます:
Field Name: Id, Field Value: 1, Address: 0x408125440 , Field type: int , Field kind: int Field Name: F, Field Value: {2 {3}}, Address: 0x408125444 , Field type: main.V , Field kind: struct Field Name: Id, Field Value: 2, Address: 0x408125450 , Field type: int , Field kind: int Field Name: F, Field Value: {3}, Address: 0x408125458 , Field type: main.Z , Field kind: struct Field Name: Id, Field Value: 3, Address: 0x408125460 , Field type: int , Field kind: int
以上がGo でリフレクションを使用して値へのポインタを取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。