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

Goでリフレクションを使用してポインターのフィールド値を取得する方法は?

Mary-Kate Olsen
リリース: 2024-11-09 07:46:02
オリジナル
1048 人が閲覧しました

How to Retrieve Field Values of Pointers Using Reflection in Go?

リフレクションを使用したポインターのフィールド値の取得

この記事では、へのポインターを含む構造体のフィールド値を取得しようとしたときに直面する問題について説明します。

次の例を考えてみましょう:

type Family struct {
   first string
   last string
}

type Person struct {
   name string
   family *Family
}
ログイン後にコピー

Family へのポインタを持つ person があると想像してください。リフレクションを使用して Family の最後のフィールドにアクセスしたいと考えています。次のコードはエラーで失敗します:

func Check(data interface{}) {
    var v = reflect.ValueOf(data)

    if v.Kind() == reflect.Struct {
        fmt.Println("was a struct")
        v = v.FieldByName("family").FieldByName("last")
        fmt.Println(v)
    }
}
ログイン後にコピー

発生したエラーは次のとおりです:

reflect: call ofreflect.Value.FieldByName on ptr Value

理由このエラーは、ポインタが指す値ではなく、ポインタを表す Reflect.Value に対して .FieldByName("family") を呼び出そうとしていることです。

この問題を解決するには、まず間接的に.FieldByName() を呼び出す前のポインター値。修正されたコードは次のようになります。

func Check(data interface{}) {
    var v = reflect.ValueOf(data)

    if v.Kind() == reflect.Struct {
        fmt.Println("was a struct")
        familyPtr := v.FieldByName("family")
        v = reflect.Indirect(familyPtr).FieldByName("last")
        fmt.Println(v)
    }
}
ログイン後にコピー

reflect.Indirect() を使用してポインター値を間接的に逆参照することで、基になる値にアクセスし、.FieldByName().

以上がGoでリフレクションを使用してポインターのフィールド値を取得する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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