컨텍스트: 저는 두 가지 유형의 구조를 취하고 해당 구조의 각 필드에 지정된 레이블이 있는지 확인한 다음 소스 구조의 값을 대상 구조로 복사하는 일반 자동 매퍼를 작성하고 있습니다. , 일치하는 태그와 유형이 있다고 가정합니다. 구조체 필드가 또 다른 (중첩) 구조체일 때마다 자동 매퍼 함수가 자동으로 토끼굴을 매핑하는 재귀 호출을 수행하기를 원합니다.
문제: 루트 구조의 구체적인 유형만 전달할 수 있습니다. 리플렉션을 사용하여 일반 함수에 들어가면 중첩된 구조체 유형을 추출하는 것이 불가능해 보입니다. 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 }
@mkopriva의 조언에 따라 제가 겪고 있는 문제에 대한 간단한 해결책을 공유하고 싶었습니다. p>
자유롭게 수정하거나 개선할 수 있지만, 아래에 다양한 확인 사항과 주장을 의도적으로 포함하지 않았다는 점을 명심하세요.
(놀이터 예시)
으아악위 내용은 리플렉션을 사용하여 유형 매개변수를 추출하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!