ホームページ  >  記事  >  バックエンド開発  >  Go でリフレクションを使用して値へのポインタを取得する方法

Go でリフレクションを使用して値へのポインタを取得する方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 15:23:02535ブラウズ

How to Get a Pointer to a Value Using Reflection in Go?

リフレクションを使用して値へのポインターを取得する

インターフェイスのフィールドを検査するには、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。