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