리플렉션을 위해 참조로 중첩 구조 전달
이 질문은 리플렉션을 사용하고 필드에 대한 기본값을 설정하여 중첩 구조를 반복하는 문제를 탐구합니다. 직면하게 되는 주요 문제는 중첩된 구조를 값으로 전달하면 필드 업데이트가 원래 구조에 반영되지 않는다는 것입니다.
이 문제를 해결하려면 리플렉션을 사용하여 참조로 구조를 전달해야 합니다. 해결 방법은 다음 단계로 구성됩니다.
중첩 구조의 포인터 값에 액세스합니다.
필드에 대해 재귀적으로 반복:
다음은 작동하는 구현입니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!