Go 1.18에서 제네릭이 역마샬링과 상호 작용하는 방법
Go 1.18의 제네릭은 향상된 유형 안전성과 코드 재사용성을 제공합니다. 그러나 제네릭을 사용하면 컴파일 시 고정 유형을 따르지 않는 JSON 페이로드를 역마샬링하는 등 동적 데이터로 작업할 때 문제가 발생할 수 있습니다.
각각 다양한 보고서 컬렉션이 있는 시나리오에서 유형이 있는 경우 일반 ReportContainerImpl 구조체를 사용하여 캡슐화할 수 있습니다. 이 구조를 사용하면 여러 유형의 보고서를 표현할 수 있지만 역마샬링 중 런타임에 구체적인 유형을 결정해야 하는 문제가 발생합니다.
이 문제를 해결하기 위해 유형 제약 조건을 사용하여 허용되는 유형을 제한할 수 있습니다. 보고 가능 유형. 그러나 Go는 구조체에 대한 유형 어설션을 지원하지 않으며 일반 유형으로의 캐스팅도 허용하지 않습니다.
한 가지 접근 방식은 ReportContainerImpl 구조체가 구현하는 전용 인터페이스인 ReportContainer를 만드는 것입니다. 이 인터페이스는 위치 ID, 제공자 및 보고서 유형과 같은 모든 보고서 유형에서 공통 필드를 검색하는 메소드를 제공합니다.
정렬화 해제 중에 스위치 문을 사용하여 ReportType 판별자를 기반으로 구체적인 유형을 결정할 수 있습니다. . 그러나 이를 위해서는 특정 구체적인 유형으로의 수동 변환이 필요하며 이는 안전하지 않고 장황할 수 있습니다.
또는 이 특정 경우에는 파라메트릭 다형성을 포기하는 것이 좋습니다. json.RawMessage를 사용하면 판별자 값에 따라 조건부로 동적 데이터를 비정렬화할 수 있습니다. 이 접근 방식은 컴파일 시 유형 매개변수가 런타임 데이터 조작 요구 사항과 일치하지 않는 시나리오에 더 적합할 수 있습니다.
일반적인 해결책으로 닭고기와 달걀 문제를 극복하고 컴파일 타임에 알려진 유형 매개변수가 있는 경우 unmarshalAny와 같은 최소한의 일반 역마샬링 함수 구현을 고려하세요. 이 함수는 원하는 유형에 대한 직접 캐스트를 사용하며 설명 목적으로 사용될 수 있습니다. json.Unmarshal은 이미 일반적이므로 이 접근 방식은 unmarshalAny 내에 추가 논리가 필요한 경우에만 권장됩니다.
위 내용은 Go 1.18에서 JSON Unmarshalling과 함께 제네릭을 어떻게 효과적으로 사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!