반영을 위해 중첩 구조를 참조로 전달
소개
다음 클라이언트 및 연락처를 고려하세요. 데이터 구조:
<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 }</code>
우리의 목표는 리플렉션을 사용하여 모든 클라이언트 구조체 필드를 반복하고, 기본 필드에 대한 기본값을 설정하고, 중첩된 구조체 필드에 동일한 단계를 반복적으로 적용하는 것입니다. 그러나 PrimaryContact 필드의 값을 설정하려고 할 때 "reflect.Value.Set using unaddressable value" 패닉이 발생합니다.
참조로 전달
문제가 발생하는 이유는 다음과 같습니다. PrimaryContact는 참조 대신 값으로 전달됩니다. 이 문제를 해결하려면 참조로 PrimaryContact를 전달해야 합니다. 이를 위해 Value.Addr()을 사용하여 구조체 필드에 대한 포인터 값을 얻습니다.
솔루션
다음 코드는 참조로 PrimaryContact를 전달하는 방법을 보여줍니다.
<code class="go">func setDefaultValue(v reflect.Value) error { if v.Kind() != reflect.Ptr { return errors.New("Not a pointer value") } v = reflect.Indirect(v) // ... (same code as before) case reflect.Struct: for i := 0; i < v.NumField(); i++ { err := setDefaultValue(v.Field(i).Addr()) if err != nil { return err } } } return nil }</code>
v.Field(i).Addr()을 사용하여 각 구조체 필드의 포인터 값을 가져오면 복사본 대신 실제 구조체 필드를 수정할 수 있습니다.
예
솔루션을 설명하기 위해 다음 클라이언트 인스턴스를 고려해 보겠습니다.
<code class="go">a := Client{}</code>
SetDefault() 함수를 호출하면 다음을 얻습니다.
<code class="go">{Id:42 Age:42 PrimaryContact:{Id:42 ClientId:42 IsPrimary:true Email:Foo} Name:Foo}</code>
이는 중첩된 PrimaryContact 구조체 필드도 기본값으로 설정되었음을 보여줍니다.
위 내용은 리플렉션을 위해 중첩된 구조를 참조로 전달하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!