>백엔드 개발 >Golang >리플렉션을 위해 중첩된 구조를 참조로 전달하는 방법은 무엇입니까?

리플렉션을 위해 중첩된 구조를 참조로 전달하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-24 01:49:01574검색

How to Pass Nested Structures by Reference for Reflection?

반영을 위해 중첩 구조를 참조로 전달

소개

다음 클라이언트 및 연락처를 고려하세요. 데이터 구조:

<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.