ホームページ > バックエンド開発 > Golang > Go でリフレクションを使用して尖った構造体のフィールドにアクセスする方法

Go でリフレクションを使用して尖った構造体のフィールドにアクセスする方法

Susan Sarandon
リリース: 2024-11-08 04:36:02
オリジナル
962 人が閲覧しました

How to Access Fields of a Pointed Struct Using Reflection in Go?

Reflect でのポインター値の処理: 「reflect: call ofreflect.Value.FieldByName on ptr Value」エラーの解決

提供されたコードでは、データ構造は定義した構造体 Family は、 Person 構造体にポインターとして保存されます。 Reflect パッケージを使用して、指定された Family 内のフィールドにアクセスしようとすると、「reflect: call ofreflect.Value.FieldByName on ptr Value」というエラーが発生します。

エラーについて

このエラーは、reflect パッケージの FieldByName 関数が入力として非ポインター値を予期しているために発生します。ポインター (*Family) を FieldByName のレシーバーとして使用すると、関数は、ポインターが指す値ではなく、ポインター自体にアクセスしようとします。

問題の解決

この問題を解決するには、フィールドにアクセスする前にポインターを間接的に指定する必要があります。これは、reflect パッケージの Indirect 関数を使用して実行できます。

familyPtr := v.FieldByName("family")
v = reflect.Indirect(familyPtr).FieldByName("last")
ログイン後にコピー
  • familyPtr は、ファミリー フィールドの Reflect.Value を取得します。
  • Indirect(familyPtr) はポインターを逆参照します。
  • FieldByName("last") は、逆参照された Family 値から「最後の」フィールドを取得します。

更新されたコード

ポインター値を正しく処理する更新されたコードは次のとおりです:

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)
    }
}
ログイン後にコピー

以上がGo でリフレクションを使用して尖った構造体のフィールドにアクセスする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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