BackEnd

Go 1.24で追加されたjsonのomitzero

投稿日:

はじめに

2025年2月11日にGoの1.24がリリースされました。

そこで、今回は更新点に軽く触れつつ、新しく追加された encoding/jsonomitzero タグについて紹介します。

1.24の更新点

Go 1.24では多くの機能追加や変更点があります。その中で目に止まったものをいくつか列挙します。

  1. go get コマンドに -tool フラグを追加
  2. Runtimeの改善によりCPUのoverheadが平均2〜3%ほど減少した
  3. os.Root 型の追加
  4. 弱い参照を提供する weak パッケージの追加
  5. 暗号化関連の機能強化多数
  6. bytes パッケージと strings パッケージに iterator を扱う関数が追加
  7. encoding/json パッケージに omitzero タグを追加

詳細については、 Release Notes をご覧ください。

jsonのomitzeroタグ

omitzero タグは構造体をMarshalする際にフィールドがゼロ値の場合は省略してくれるオプションです。

似たようなオプションに omitempty タグがありますが、こちらは 0""nil の場合には省略されます。しかし、構造体の場合は省略されず以下のようになってしまいます。

これが、 omitzero タグを使うことで解決できます。

Go 1.23までの場合

まずは、これまで通り omitempty タグを使った場合を見ていきます。

以下のようになります。

コード

結果

このように time.Time だけは初期値で含まれてしまっています。これを回避するために、あえてポインタ型にする対応が取られることがありました。

コード

結果

Go 1.24での場合

omitempty の代わりに omitzero を使った場合以下のようになります。

コード

結果

このように、ポインタ型にしなくても省略することができました。

要素が空の場合とnilの場合

omitempty の場合、要素が空であっても、 nil でも区別なく省略されてしまいますが、 omitzero の場合、これらは別々のものとして扱われます。

コード

結果

このように、 omitzero の場合、要素が空の場合は省略されません。

omitzeroをコントロールする

omitzero で省略するかどうかは IsZero メソッドで判定されます。そのため、自分で定義した構造体にこのメソッドを定義することで、どのような状態の場合に省略するのかコントロールすることができます。

コード

結果

このように IsZero メソッドの戻り値が true の場合は省略されるようになります。

さいごに

encoding/json に追加された omitzero タグについて紹介しました。

大きな変更点というわけではありませんが、かゆいところに手が届く良い機能だと思います。

おすすめ書籍

初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド Go言語 100Tips ありがちなミスを把握し、実装を最適化する impress top gearシリーズ 実用 Go言語 ―システム開発の現場で知っておきたいアドバイス Go言語で学ぶ並行プログラミング 他言語にも適用できる原則とベストプラクティス impress top gearシリーズ

blog-page_footer_336




blog-page_footer_336




-BackEnd
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

js

TypeScriptでJavaScriptのライブラリを使用するには?

1 はじめに2 対応方法2.1 npmで@typesからインストールする2.2 自分で型定義ファイルを作る3 Declaration Space3.1 Type Declaration Space3. ...

FastAPIのPath Operationをasync defにするときはブロッキングに気をつけよう!

1 はじめに2 Path Operationと並行処理3 挙動の確認4 対応方法4.1 asyncioを使って自力で非同期化する4.2 async対応済みのパッケージを使う4.3 async defを ...

laravel logo

Laravelでテストコードを書くには? Featureテスト/Unitテスト

1 はじめに2 FeatureとUnitの使い分け3 テスト用データベースの準備4 Featureテスト4.1 テスト対象のコード4.2 テストコードの実装4.3 テスト結果の検証4.3.1 ステータ ...

Go言語

GoのWeb Application Framework

1 はじめに2 代表的なGoのWAF2.1 軽量なWAF2.2 フルスタックなWAF3 Ginを使ってみる3.1 クエリパラメータ+ポストパラメータ3.2 ファイルアップロード3.3 URLのグループ ...

laravel logo

LaravelのFacade(ファサード)とは? 何気なく使用していた裏側の仕組みを解説!

1 はじめに1.1 Facadeを使用しているクラス2 Facadeの仕組み3 Facadeの作成3.1 サンプルコードに必要な実装3.2 Serviceの作成3.3 Facadeクラスの作成3.4 ...

フォロー

blog-page_side_responsive

2025年2月
 1
2345678
9101112131415
16171819202122
232425262728  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。