유형 어설션에 의존하지 않고 유형 안전 JSON 구문 분석을 위해 Go\의 'Unmarshal' 함수에서 일반 유형을 어떻게 사용할 수 있나요?

Mary-Kate Olsen
풀어 주다: 2024-10-30 01:08:02
원래의
507명이 탐색했습니다.

How can I use generic types in Go's `Unmarshal` function for type-safe JSON parsing without resorting to type assertions?

Unmarshal의 제네릭 자세히 살펴보기

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

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