> 백엔드 개발 > Golang > Go의 `json.Marshal()`이 소문자 접두어로 구조체 필드를 직렬화하지 않는 이유는 무엇입니까?

Go의 `json.Marshal()`이 소문자 접두어로 구조체 필드를 직렬화하지 않는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-21 21:44:46
원래의
641명이 탐색했습니다.

Why Doesn't Go's `json.Marshal()` Serialize Struct Fields with Lowercase Prefixes?

Go에서 소문자 접두사가 있는 구조체 필드에 대한 JSON 생성 제한 탐색

Go에서 개발자는 JSON을 생성하려고 시도하는 동안 문제에 자주 직면합니다. 소문자 접두사 문자가 있는 필드를 소유하는 구조체입니다. 이 문제를 효과적으로 해결하려면 근본적인 이유를 이해하는 것이 중요합니다.

이 문제는 패키지 내에서 공개 식별자를 식별하는 Go의 규칙으로 인해 발생합니다. 대문자 첫 글자가 있는 식별자는 공개로 간주되며 패키지 외부에서 액세스할 수 있습니다. 반대로, 첫 글자가 소문자인 식별자는 비공개로 간주되며 현재 패키지 내에서만 표시됩니다.

다음 코드 조각을 고려하세요.

type Machine struct {
  m_ip string
  m_type string
  m_serial string
}
로그인 후 복사

다음 코드 조각을 고려하세요.

json.Marshal()을 사용하여 이 구조체를 생성하면 "{}"이라는 예상치 못한 결과가 나타날 수도 있습니다. 이는 m_ip, m_type 및 m_serial 필드가 비공개로 간주되어(소문자 접두사로 표시됨) json.Marshal()에 표시되지 않기 때문입니다.
type Machine struct {
  MachIp string
  MachType string
  MachSerial string
}
로그인 후 복사

그러나 아래와 같이 필드를 대문자로 변경합니다. 을 사용하면 문제가 해결됩니다.

대문자 접두어를 활용하면 이러한 필드를 공개적으로 액세스할 수 있게 되어 다음을 허용할 수 있습니다. json.Marshal()을 사용하여 원하는 JSON 출력을 성공적으로 생성할 수 있습니다.
type Machine struct {
    MachIp     string `json:"m_ip"`
    MachType   string `json:"m_type"`
    MachSerial string `json:"m_serial"`
}
로그인 후 복사

JSON 출력에 소문자 식별자가 필요한 경우 필드 태그 지정을 사용할 수 있습니다. 해당 JSON 이름으로 각 필드에 주석을 추가하면 기본 동작을 재정의할 수 있습니다. 예를 들면 다음과 같습니다.

이 태그 지정 메커니즘을 통해 초기 대소문자에 관계없이 원하는 JSON 필드 이름을 명시적으로 지정할 수 있으므로 애플리케이션 요구 사항에 맞는 JSON 출력을 생성할 수 있습니다.

위 내용은 Go의 `json.Marshal()`이 소문자 접두어로 구조체 필드를 직렬화하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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