Go 1.24's 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 は、Web ホスティング、非同期タスク、Redis 向けの次世代サーバーレスプラットフォームです。
多言語サポート
- Node.js、Python、Go、または Rust で開発できます。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ支払い — リクエストも課金もありません。
他に類を見ない費用対効果
- アイドル時の課金なしで従量課金制。
- 例: 25 ドルで、平均応答時間 60 ミリ秒で 694 万リクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的な UI。
- 完全に自動化された CI/CD パイプラインと GitOps 統合。
- 実用的な洞察のためのリアルタイムメトリクスとロギング。
簡単なスケーラビリティと高いパフォーマンス
- 高い並行処理を容易に処理するための自動スケーリング。
- 運用オーバーヘッドはゼロ — 構築に集中するだけです。
詳細については、ドキュメントをご覧ください。
X でフォローしてください: @LeapcellHQ