Go의 제네릭은 재사용이 가능하고 유형이 안전한 코드를 작성하기 위한 강력한 도구입니다. 그러나 Unmarshal과 함께 제네릭을 사용할 때 우리가 알아야 할 몇 가지 문제가 있습니다.
이 Q&A에서 사용자는 제네릭을 사용하여 역마샬링을 위한 보다 유형 안전한 방법을 만들려고 합니다. JSON 데이터를 구조체로 변환합니다. 그들이 직면한 문제는 GetBody() 함수에 유형 제약 조건을 사용할 수 없기 때문에 코드에서 유형 어설션을 사용해야 한다는 것입니다.
그 이유는 Go가 구조체에 대해서는 유형 어설션을 지원하지 않고 인터페이스에 대해서만 지원합니다. 즉, 구조체의 정확한 유형을 먼저 알지 못하면 GetBody() 함수를 특정 유형으로 캐스팅할 수 없습니다.
이 문제에 대한 가능한 해결책 중 하나는 스위치 문을 사용하여 ReportType 필드를 확인하는 것입니다. 구조체를 찾은 다음 GetBody() 함수를 적절한 유형으로 캐스팅합니다. 그러나 이 솔루션은 그다지 우아하지 않으며 구조체에 포함될 수 있는 다양한 유형의 수가 증가함에 따라 유지 관리가 어려울 수 있습니다.
이 문제에 대한 더 나은 해결책은 다음에서 유형 스위치 표현식을 사용하는 것입니다. GetBody() 함수. 이렇게 하면 스위치 문을 사용하지 않고도 GetBody() 함수를 적절한 유형으로 캐스팅할 수 있습니다. 이는 더욱 우아하고 유지 관리도 더 용이합니다.
이 솔루션을 설명하기 위해 다음은 GetBody() 함수의 수정된 버전입니다.
<code class="go">func (c *ReportContainerImpl[T]) GetBody() (T, error) { var body T var err error switch c.ReportType { case ReportTypeExportDataPointReport: err = json.Unmarshal(c.Body, &body) case ReportTypeImportDataPointReport: err = json.Unmarshal(c.Body, &body) case ReportTypeMissingDataPointReport: err = json.Unmarshal(c.Body, &body) case ReportTypeSensorThresoldReport: err = json.Unmarshal(c.Body, &body) } return body, err }</code>
이러한 변경으로 우리는 이제 GetBody() 함수를 사용하여 스위치 문을 사용하지 않고도 구조체의 본문을 검색할 수 있습니다. 이렇게 하면 코드가 더욱 우아해지고 유지 관리가 쉬워집니다.
위 내용은 유형 어설션에 의존하지 않고 유형 안전 JSON 구문 분석을 위해 Go\의 'Unmarshal' 함수에서 일반 유형을 어떻게 사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!