> 백엔드 개발 > Golang > 내보내지 않은 구조체 및 유형 캐스팅을 사용하여 Go의 JSON 태그 제한 사항을 어떻게 해결할 수 있나요?

내보내지 않은 구조체 및 유형 캐스팅을 사용하여 Go의 JSON 태그 제한 사항을 어떻게 해결할 수 있나요?

Linda Hamilton
풀어 주다: 2024-12-30 10:34:10
원래의
327명이 탐색했습니다.

How Can I Work Around Go's JSON Tag Restrictions Using Unexported Structs and Type Casting?

내보내지 않은 구조체 내에서 유형 캐스팅 사용

Go에서는 구조체의 동일한 필드에 대해 여러 JSON 태그를 정의할 수 없습니다. 그러나 내보내지 않은 구조체 사이에 캐스팅을 사용하는 해결 방법이 있습니다.

먼저 예와 같이 서로 다른 JSON 태그를 사용하여 동일한 구조의 구조체 두 개를 만듭니다.

type Foo struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

type Bar struct {
    Name string `json:"employee_name"`
    // Age omitted with backtick syntax
    Age  int    `json:"-"`
}
로그인 후 복사

이제 Bar를 내보내지 않도록 만듭니다. 이름을 소문자로 시작:

type bar struct {
    Name string `json:"employee_name"`
    Age  int    `json:"-"`
}
로그인 후 복사

Foo에서 bar로 변환하려면 Foo를 캐스팅하세요. 아래와 같이 *bar로 변환:

f := Foo{Name: "Sam", Age: 20}
b := (*bar)(unsafe.Pointer(&f))

// b now has the modified JSON tags
로그인 후 복사

주의:

  • 이 기술은 통제된 환경 내에서만 주의해서 사용해야 합니다.
  • 내보내지 않은 막대 유형을 현재 패키지 외부에 노출하지 마십시오.
  • 유형은 항상 정렬됩니다. 그렇지 않으면 캐스팅이 패닉 상태가 됩니다.

예:

package main

import "fmt"
import "unsafe"

type Foo struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

type bar struct {
    Name string `json:"employee_name"`
    Age  int    `json:"-"`
}

func main() {
    f := Foo{Name: "Sam", Age: 20}
    b := (*bar)(unsafe.Pointer(&f))

    fmt.Println(b.Name, b.Age) // Output: Sam 0

    // Changing f.Age affects b.Age
    f.Age = 30
    fmt.Println(b.Name, b.Age) // Output: Sam 30
}
로그인 후 복사

위 내용은 내보내지 않은 구조체 및 유형 캐스팅을 사용하여 Go의 JSON 태그 제한 사항을 어떻게 해결할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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