リフレクションベースの値設定のためにネストされた構造を参照によって渡す
当面のタスクには、リフレクションを使用してネストされた構造、つまりクライアントを走査することが含まれます。 。単純なフィールドごとに、デフォルト値を設定することが目的です。ただし、クライアント内でネストされた Contact 構造を処理するときに問題が発生します。
リフレクションにより、実行時にデータ構造のイントロスペクションと操作が可能になります。ただし、デフォルトでは、値は参照ではなく値によって渡されます。これは、値渡し構造のフィールドを変更しても、元の引数には影響しないことを意味します。
解決策: 参照渡し
この問題を克服する鍵は次のとおりです。ネストされた Contact 構造を参照によって渡す場合。 Reflection には、値のアドレスを取得するための Value.Addr() メソッドが用意されており、これにより値が効果的にポインタに変換されます。したがって、デフォルト値を設定する関数に Value.Addr() を渡すことで、Contact 構造体の実際の値を変更できます。
実装
SetDefault 関数は、interface{} 引数を受け取り、サポートされているすべてのフィールド タイプのデフォルト値を設定します。 Contact 構造体の場合、Value.Addr() を使用して値を参照渡しします。
<code class="go">func setDefaultValue(v reflect.Value) error { switch v.Kind() { case reflect.Ptr: v = reflect.Indirect(v) fallthrough case reflect.Struct: // Iterate over the struct fields for i := 0; i < v.NumField(); i++ { err := setDefaultValue(v.Field(i).Addr()) if err != nil { return err } } default: // Set default values for supported types // ... } return nil }</code>
例
次の例を考えてみましょう:
<code class="go">type Client struct { Id int Age int PrimaryContact Contact Name string } type Contact struct { Id int ClientId int IsPrimary bool Email string } 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}
結論
リフレクションを使用してネストされた構造を参照によって渡すことにより、トラバースしてデフォルト値を設定することができますネストされた構造内のフィールドを含む、構造内のすべてのフィールド。これを実現するには、リフレクションによって提供される Value.Addr() メソッドが重要です。
以上がリフレクションベースの値設定のために入れ子構造を参照で渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。