Go 1.24의 omitzero 태그 설명
Emily Parker
Product Engineer · Leapcell

서론
Go 버전 1.24에서 encoding/json
패키지는 omitzero
태그를 도입하여, 제로 값 필드를 무시하는 동작을 더욱 명시적이고 사용자 정의 가능하게 만들었습니다. 이 글에서는 omitzero
태그를 사용하는 방법에 대한 자세한 설명을 제공합니다.
omitzero
태그
omitzero
태그는 Go 객체를 JSON으로 직렬화할 때 어떤 제로 값 필드를 생략할지 제어하는 데 사용됩니다. 빈 값 필드를 생략하는 omitempty
태그와 달리, 제로 값과 빈 값은 유사하지만 Go에서는 동일하지 않습니다. 예를 들면 다음과 같습니다.
time.Time
타입의 경우, 제로 값은"0001-01-01T00:00:00Z"
이며, 이는 빈 값으로 간주되지 않습니다.IntSlice []int
와 같은 슬라이스 필드의 경우,[]
와nil
모두 빈 값으로 간주됩니다.
omitzero
를 사용하는 이유
- 정밀한 제어: 빈 값이 아닌 제로 값 필드를 명시적으로 생략합니다.
- 사용자 정의 제어:
IsZero() bool
메서드를 구현하여 필드의 제로 값을 결정하는 사용자 정의 로직을 정의할 수 있습니다.
omitzero
태그 사용하기
package main import ( "encoding/json" "fmt" "time" ) type User struct { Name string `json:"name,omitzero"` Age int `json:"age,omitzero"` Hobbies []string `json:"hobbies,omitzero"` BornAt time.Time `json:"born_at,omitzero"` } func main() { user := User{ Name: "Leapcell", Age: 18, Hobbies: []string{}, } bytes, _ := json.MarshalIndent(user, "", " ") fmt.Println(string(bytes)) }
string(bytes)
를 실행하면 다음 JSON 결과가 출력됩니다.
{ "name": "Leapcell", "age": 18, "hobbies": [] }
만약 omitempty
태그가 대신 사용되었다면, hobbies
필드는 생략되었을 것입니다. 또한, born_at
이 제로 값이라도 "born_at": "0001-01-01T00:00:00Z"
로 직렬화됩니다. omitzero
태그를 사용함으로써, 우리는 어떤 필드를 무시할지 더욱 정확하게 제어하여 제로 값 필드만 제외되도록 보장할 수 있습니다.
IsZero() bool
메서드
IsZero() bool
메서드는 필드가 제로 값인지 여부를 결정하는 로직을 사용자 정의하는 데 사용됩니다. 필드의 제로 값이 결정되는 방식을 변경하려면 해당 필드에 대해 IsZero
메서드를 구현할 수 있습니다. 다음은 예제입니다.
package main import ( "encoding/json" "fmt" "time" ) type Age int func (age *Age) IsZero() bool { return *age <= 0 } type User struct { Name string `json:"name,omitzero"` Age Age `json:"age,omitzero"` Hobbies []string `json:"hobbies,omitzero"` BornAt time.Time `json:"born_at,omitzero"` } func main() { user := User{ Name: "Leapcell", Age: -1, Hobbies: []string{}, } bytes, _ := json.MarshalIndent(user, "", " ") fmt.Println(string(bytes)) }
이 예제에서 Age
필드는 IsZero
메서드를 구현하여 자체 제로 값 로직을 정의합니다. Age
가 0보다 작거나 같으면 IsZero
는 true
를 반환하고, 필드는 직렬화 중에 생략됩니다. 출력은 다음과 같습니다.
{ "name": "Leapcell", "hobbies": [] }
요약
Go에서 omitzero
태그를 사용하여 JSON 직렬화 중에 어떤 필드를 생략할지 정확하게 제어하여 제로 값 필드만 제외되도록 할 수 있습니다. 또한, IsZero
메서드를 구현하여 특정 필드에 대한 사용자 정의 제로 값 로직을 정의함으로써 더욱 유연하고 컨텍스트 인식적인 직렬화 동작을 가능하게 합니다.
Go 프로젝트 호스팅을 위한 최고의 선택, Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하세요.
무제한 프로젝트를 무료로 배포하세요
- 사용량에 따라서만 비용을 지불하세요. 요청당 과금 또는 유휴 요금이 없습니다.
압도적인 비용 효율성
- 사용량에 따른 지불 방식으로 유휴 요금이 없습니다.
- 예시: $25로 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 직관적인 UI로 간편하게 설정할 수 있습니다.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 높은 동시성을 쉽게 처리하기 위한 자동 확장.
- 운영 오버헤드가 전혀 없습니다. 빌드에만 집중하세요.
문서에서 자세히 알아보세요!
X에서 저희를 팔로우하세요: @LeapcellHQ