Go JSON 인코딩에서 `omitempty` 태그 이해
Wenhao Wang
Dev Intern · Leapcell

Key Takeaways
omitempty태그는 비어 있는 값을 가질 때 JSON 출력에서 필드를 생략합니다.- 구조체는 비어 있을 때 생략되려면 포인터여야 합니다.
- 0 값은 의도치 않게 생략되어 데이터 완성도에 영향을 줄 수 있습니다.
Go에서 구조체 필드 태그는 JSON 인코딩 및 디코딩을 사용자 정의하는 강력한 옵션을 제공합니다. 일반적으로 사용되는 태그 중 하나는 omitempty이며, 이는 JSON 인코더에게 필드 값이 비어 있으면 출력에서 필드를 생략하도록 지시합니다. omitempty가 어떻게 작동하는지 이해하는 것은 Go에서 효과적인 JSON 처리에 필수적입니다.
omitempty는 무엇을 합니까?
omitempty 태그는 필드 값이 비어 있는 것으로 간주되면 JSON 출력에서 구조체 필드를 제외하도록 JSON 인코더에 알립니다. Go에서 값은 다음과 같은 경우 비어 있는 것으로 간주됩니다.
- 부울 유형의 경우
false - 숫자 유형의 경우
0 - 문자열의 경우
"" - 포인터, 인터페이스, 맵, 슬라이스 및 채널의 경우
nil - 길이가 0인 배열, 슬라이스 또는 맵
예를 들어:
type Example struct { Name string `json:"name,omitempty"` Age int `json:"age,omitempty"` Email string `json:"email,omitempty"` }
Example 구조체의 Age가 0으로 설정되고 Email이 빈 문자열로 설정된 경우 해당 필드는 JSON 출력에서 생략됩니다.
기본 사용법
다음 구조체를 고려하십시오.
type Dog struct { Breed string `json:"breed"` WeightKg int `json:"weight_kg,omitempty"` }
WeightKg가 0인 Dog 인스턴스를 인코딩할 때 JSON 출력은 weight_kg 필드를 제외합니다.
d := Dog{ Breed: "pug", } b, _ := json.Marshal(d) fmt.Println(string(b)) // 출력: {"breed":"pug"}
여기서 WeightKg는 0 값(0)이 비어 있는 것으로 간주되기 때문에 생략됩니다.
중첩된 구조체와 함께 사용하는 omitempty
omitempty 태그는 모든 필드가 비어 있어도 중첩된 구조체를 자동으로 생략하지 않습니다. 예를 들어:
type Dimensions struct { Height int `json:"height,omitempty"` Width int `json:"width,omitempty"` } type Dog struct { Breed string `json:"breed"` WeightKg int `json:"weight_kg,omitempty"` Size Dimensions `json:"size,omitempty"` }
Size가 빈 Dimensions 구조체인 경우에도 JSON 출력에 계속 나타납니다.
d := Dog{ Breed: "pug", } b, _ := json.Marshal(d) fmt.Println(string(b)) // 출력: {"breed":"pug","size":{"height":0,"width":0}}
Size에 0 값이 있을 때 생략하려면 포인터로 정의하십시오.
type Dog struct { Breed string `json:"breed"` WeightKg int `json:"weight_kg,omitempty"` Size *Dimensions `json:"size,omitempty"` }
이제 Size가 nil이면 생략됩니다.
d := Dog{ Breed: "pug", } b, _ := json.Marshal(d) fmt.Println(string(b)) // 출력: {"breed":"pug"}
특별 고려 사항
0 값 대 생략된 필드
omitempty를 사용하면 0 값이 있는 필드가 생략되는 상황이 발생할 수 있으며, 이는 항상 바람직하지 않을 수 있습니다. 예를 들어:
type Restaurant struct { NumberOfCustomers int `json:"number_of_customers,omitempty"` Name string `json:"name"` } r := Restaurant{ Name: "Diner", } b, _ := json.Marshal(r) fmt.Println(string(b)) // 출력: {"name":"Diner"}
여기서 NumberOfCustomers는 0 값(0)이 비어 있는 것으로 간주되기 때문에 생략됩니다. 0 값이 있는 필드를 포함하려면 해당 필드에 대해 omitempty를 사용하지 마십시오.
time.Time 필드 처리
time.Time 유형은 구조체이며, 0 값(time.Time{})은 omitempty에 의해 비어 있는 것으로 간주되지 않습니다. time.Time 필드가 0일 때 생략하려면 포인터로 정의하십시오.
type Event struct { Name string `json:"name"` Timestamp *time.Time `json:"timestamp,omitempty"` }
Timestamp가 nil이면 JSON 출력에서 생략됩니다.
결론
omitempty 태그는 Go의 JSON 인코딩에서 유용한 도구이며, 비어 있는 값을 가진 필드를 제외하여 더 깔끔한 JSON 출력을 허용합니다. 그러나 Go가 다른 유형에 대해 비어 있는 것으로 간주하는 것과 omitempty가 중첩된 구조체 및 0 값과 상호 작용하는 방식을 염두에 두는 것이 중요합니다. omitempty를 적절하게 활용하면 JSON 직렬화가 애플리케이션 요구 사항과 일치하는지 확인할 수 있습니다.
자세한 내용은 encoding/json 패키지에 대한 공식 Go 설명서와 이 주제에 대한 커뮤니티 토론을 참조하십시오.
FAQs
0, false, "", nil 포인터, 빈 슬라이스 및 빈 맵과 같은 0 값입니다.
비 포인터 구조체는 nil로 간주되지 않으므로 생략되지 않습니다.
*time.Time 포인터를 사용하고 필요하지 않을 때 nil로 설정하십시오.
Go 프로젝트 호스팅을 위한 최고의 선택인 Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 비용을 지불하십시오. 요청도 없고 요금도 없습니다.
타의 추종을 불허하는 비용 효율성
- 유휴 요금 없이 사용한 만큼만 지불하십시오.
- 예: $25는 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
간편한 확장성과 고성능
- 쉬운 고 동시성 처리를 위한 자동 확장.
- 운영 오버헤드가 0이므로 구축에만 집중하십시오.
설명서에서 자세히 알아보십시오!
X에서 팔로우하세요: @LeapcellHQ



