리플렉션을 사용하여 유형 매개변수를 추출하는 방법

王林
풀어 주다: 2024-02-12 17:24:05
앞으로
574명이 탐색했습니다.

리플렉션을 사용하여 유형 매개변수를 추출하는 방법

질문 내용

컨텍스트: 저는 두 가지 유형의 구조를 취하고 해당 구조의 각 필드에 지정된 레이블이 있는지 확인한 다음 소스 구조의 값을 대상 구조로 복사하는 일반 자동 매퍼를 작성하고 있습니다. , 일치하는 태그와 유형이 있다고 가정합니다. 구조체 필드가 ​​또 다른 (중첩) 구조체일 때마다 자동 매퍼 함수가 자동으로 토끼굴을 매핑하는 재귀 호출을 수행하기를 원합니다.

문제: 루트 구조의 구체적인 유형만 전달할 수 있습니다. 리플렉션을 사용하여 일반 함수에 들어가면 중첩된 구조체 유형을 추출하는 것이 불가능해 보입니다. value.interface()를 매개변수로 전달할 수 있지만 여전히 유형 매개변수를 전달해야 합니다.

다음은 문제를 보여주는 몇 가지 단순화된 코드입니다.

type Alpha struct {
    Nested Beta `automap:"nested"`
}

type Beta struct {
    Info string `automap:"info"`
}

type Foo struct {
    Nested Bar `automap:"nested"`
}

type Bar struct {
    Info string `automap:"info"`
}

func TestAutoMap(t *testing.T) {

    b := Beta{Info: "Hello from Beta!"}
    a := Alpha{Nested: b}

    f, err := AutoMap[Alpha, Foo](a)
    if err != nil {
        fmt.Println(err)
        t.Fail()
    }
    fmt.Println("f.nested.info:", f.Nested.Info)
}

func AutoMap[S, T any](source S) (target T, err error) {

    targetStruct := reflect.ValueOf(&target).Elem()
    sourceStruct := reflect.ValueOf(&source).Elem()

    // .Type and .Kind directly did not work.
    nestedSourceType := ??? // I want this to be type Beta.
    nestedTargetType := ??? // I want this to be type Bar.

    sourceInterface := sourceStruct.Interface()

    t, err := AutoMap[nestedSourceType, nestedTargetType](sourceInterface)
    if err != nil {
        return target, err
    }
    target = t

    return target, nil
}
로그인 후 복사

Solution

@mkopriva의 조언에 따라 제가 겪고 있는 문제에 대한 간단한 해결책을 공유하고 싶었습니다. p>

자유롭게 수정하거나 개선할 수 있지만, 아래에 다양한 확인 사항과 주장을 의도적으로 포함하지 않았다는 점을 명심하세요.

(놀이터 예시)

으아악

위 내용은 리플렉션을 사용하여 유형 매개변수를 추출하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!