リフレクションのためにネストされた構造を参照によって渡す
この質問では、リフレクションを使用してネストされた構造をループし、フィールドのデフォルト値を設定するという課題について説明します。発生する主な問題は、ネストされた構造を値で渡すとフィールドの更新が元の構造に反映されなくなることです。
これに対処するには、リフレクションを使用して構造を参照で渡す必要があります。この解決策には次の手順が含まれます。
ネストされた構造体のポインタ値にアクセスします。
フィールドを再帰的に反復します:
これが動作する実装です:
<code class="go">import ( "fmt" "reflect" ) type Client struct { Id int Age int PrimaryContact Contact Name string } type Contact struct { Id int ClientId int IsPrimary bool Email string } func SetDefault(s interface{}) error { return setDefaultValue(reflect.ValueOf(s).Elem()) } func setDefaultValue(v reflect.Value) error { switch v.Kind() { case reflect.Int: v.SetInt(42) case reflect.String: v.SetString("Foo") case reflect.Bool: v.SetBool(true) case reflect.Struct: // Recursive call using the pointer value of the nested struct err := setDefaultValue(v.Addr()) if err != nil { return err } default: return errors.New("Unsupported kind: " + v.Kind().String()) } return nil } func main() { a := Client{} err := SetDefault(&a) if err != nil { fmt.Println("Error: ", err) } else { fmt.Printf("%+v\n", a) } }</code>
このコードは、リフレクションを使用して参照渡しすることにより、すべてのプリミティブ フィールドとネストされた構造のデフォルト値を再帰的に設定します。サンプル出力は次のとおりです。
{Id:42 Age:42 PrimaryContact:{Id:42 ClientId:42 IsPrimary:true Email:Foo} Name:Foo}
この手法を使用すると、リフレクションを使用してネストされた構造を効果的にループし、変更を元の構造に確実に反映させながらデフォルト値を設定できます。
以上が参照による反射を使用して入れ子構造のデフォルト値を設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。