この記事では、へのポインターを含む構造体のフィールド値を取得しようとしたときに直面する問題について説明します。
次の例を考えてみましょう:
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 サイトの他の関連記事を参照してください。