>  기사  >  백엔드 개발  >  Go 1.18에서 일반 유형으로 JSON을 안전하게 역마샬링하려면 어떻게 해야 합니까?

Go 1.18에서 일반 유형으로 JSON을 안전하게 역마샬링하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-01 12:35:02760검색

How Can I Safely Unmarshal JSON with Generic Types in Go 1.18?

Unmarshal(Go 1.18)에서 일반 사용

다양한 보고서 유형을 담는 컨테이너를 만드는 등 Go 1.18에서 제네릭을 활용하는 경우, 유형 제약이 발생할 수 있습니다. 다음 설정을 고려하십시오.

  • 구조체로 표시되는 여러 보고서 유형
  • 일반 유형 매개변수 Reportable이 있는 ReportContainer 래퍼, Reportable 인터페이스를 구현하도록 제한됨
  • 판별자 역마샬링 중 구체적인 보고서 유형을 결정하기 위한 ReportType

유형 어설션을 수용하기 위해 GetBody() 함수에서 "자유 ​​텍스트 의미 체계"로 이어지는 반환 유형에 대한 유형 제한 문제에 직면할 수 있습니다.

도전과제 및 솔루션

이 문제는 Go가 구조체에 대한 유형 어설션을 지원하지 않고 일반 유형에 대한 포인터를 허용하지 않기 때문에 발생합니다. 이 문제를 해결하기 위해 LocationID, Provider, ReportType 및 Body에 대한 Getter를 구현하는 인터페이스를 만들 수 있습니다. 그러나 이 솔루션에는 유형 안전성이 희생되어야 합니다.

더 안전한 접근 방식은 매개변수 다형성을 포기하고 JSON 역마샬링 중 판별자 값을 기반으로 구체적인 스위치 문을 활용하는 것입니다. 이렇게 하면 각 보고서 유형에 올바른 구체적인 유형이 사용됩니다.

대체 접근 방식

동적 JSON 구문 분석의 경우 일반 비정렬 함수를 사용할 수 있습니다.

<code class="go">func unmarshalAny[T any](bytes []byte) (*T, error) {
    out := new(T)
    if err := json.Unmarshal(bytes, out); err != nil {
        return nil, err
    }
    return out, nil
}</code>

이 함수는 유연성을 제공하지만 구현이 최소화된 경우 역마샬링 논리를 직접 인라인하는 것과 동일한 작업만 수행한다는 점에 유의해야 합니다. 따라서 이 기능을 사용하는 것은 추가 논리를 도입하는 경우에만 정당화됩니다.

요약하자면, 구체적인 유형 및 JSON 역마샬링 작업을 수행할 때 제네릭의 필요성을 신중하게 고려하세요. 필요한 경우 유형 안전성을 손상시키지 않고 스위치 기반 솔루션을 선택하고, 불필요하게 기능을 복제하는 일반 기능을 사용할 때는 주의하십시오.

위 내용은 Go 1.18에서 일반 유형으로 JSON을 안전하게 역마샬링하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.