透過反射傳遞巢狀結構
本問題探討了使用反射循環嵌套結構並設定欄位預設值的挑戰。遇到的主要問題是按值傳遞嵌套結構會阻止欄位更新反映在原始結構中。
為了解決這個問題,我們必須使用反射來依照引用傳遞結構。解涉及以下步驟:
存取巢狀結構的指標值:
遞歸迭代字段:
這是一個有效的實現:
<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中文網其他相關文章!