提供されたコードでは、データ構造は定義した構造体 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")
更新されたコード
ポインター値を正しく処理する更新されたコードは次のとおりです:
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 サイトの他の関連記事を参照してください。