9 ポイント 投稿者 lemonmint 2025-08-13 | まだコメントはありません。 | WhatsAppで共有

[IMG] Overview

Go 1.25 が正式にリリースされました。今回のバージョンには、ツール、ランタイム、コンパイラ、標準ライブラリ全体にわたる改善が含まれており、特にユーザーが事前に試してフィードバックを提供できる重要な実験的機能が導入されています。

  • 主な特徴:
    • Go 1 系バージョンとの互換性を維持
    • ツール、ランタイム、コンパイラ、ライブラリなど広範な改善
    • 新しい実験的機能(GreenTea GC、json/v2 パッケージ)の導入

主要な実験的機能

Go 1.25 には、性能向上と機能改善を目的とした 2 つの主要な実験的機能が含まれており、ユーザーは環境変数の設定によって有効化できます。

新しい GreenTea ガベージコレクタ(GC)

多数の小さなオブジェクトを処理する際に発生する GC オーバーヘッドを減らし、性能を向上させることを目指しています。

  • 動作方式: 512 バイト未満の小さなオブジェクトを 8KiB サイズの「メモリスパン(Memory Span)」単位でグループ化して GC を実行します。これによりメモリ局所性(locality)を高め、CPU キャッシュ効率を最大化します。
  • 期待される効果:
    • メモリアクセスの飛びによるコスト低減に伴う GC 性能の向上
    • マルチコア環境での効率的な動作
    • 小さなオブジェクト割り当てのオーバーヘッドおよびメモリ断片化の低減
  • 有効化方法: ビルド時に GOEXPERIMENT=greenteagc 環境変数を設定
新しい encoding/json/v2 パッケージ

既存の encoding/json(v1)が抱えていた一貫性の不足、予測しにくい動作、性能上の問題を解決するために新たに設計された JSON 実装です。

  • 中核目標:

    • 正確性と予測可能性の向上: デフォルトでより厳格なルール(例: 大文字小文字の区別、重複キーの禁止)を適用し、予期しない動作を減らします。
    • 性能改善: パースおよびエンコードエンジンを再設計して効率を高めました。
    • 柔軟性と制御性の拡大: 精密なオプションシステムを導入し、開発者が JSON 処理方式を細かく制御できるようにしています。
  • 主な変更点(v1 比):

    • フィールド名マッチング: v1 の大文字小文字を区別しない方式とは異なり、v2 ではデフォルトで 大文字小文字を厳密に区別 します。
    • omitempty タグの意味変更: v1 では Go の値の「空状態」(0、false、nil など)を基準に省略していましたが、v2 ではエンコード後の JSON 値の「空状態」(null""{}[])を基準に省略します。
    • nil スライスおよびマップの扱い: v1 では null にマーシャリングしていましたが、v2 ではデフォルトでそれぞれ [](空配列)と {}(空オブジェクト)にマーシャリングします。
    • 配列のアンマーシャリング: v1 では JSON 配列と Go 配列の長さが異なっていても許容していましたが、v2 では 長さが正確に一致 しなければならず、そうでない場合はエラーを返します。
    • 重複キーの扱い: v1 では重複キーを許可し(最後の値で上書き)、v2 ではデフォルトで エラーを返す ことで正確性とセキュリティを強化します。
    • 無効な UTF-8 の扱い: v1 では無効な UTF-8 文字を自動的に置換(\uFFFD)していましたが、v2 ではデフォルトで エラーを返す ことでデータ破損を防ぎます。
  • 新機能と構造:

    • モジュール構造: 低レベルの構文解析(jsontext パッケージ)と高レベルの意味変換(json/v2 パッケージ)を分離し、コードの明確さと性能を改善しました。
    • 強力なオプションシステム: json.Options によってさまざまな動作を細かく制御でき、v1 の動作を完全に再現することも可能です。
    • 外部型の処理: WithMarshalersWithUnmarshalers オプションにより、Marshaler/Unmarshaler インターフェースを実装していない外部パッケージの型に対してシリアライズ/デシリアライズのロジックを注入できます。
  • 有効化方法: ビルド時に GOEXPERIMENT=jsonv2 環境変数を設定

主な変更点と改善

今回のリリースでは、開発生産性とプログラム実行効率を高めるためのさまざまな改善が行われました。

  • ランタイム(Runtime)

    • コンテナ環境を認識する GOMAXPROCS: Linux 環境で cgroup の CPU 制限を自動的に認識して GOMAXPROCS のデフォルト値を設定し、CPU リソースの変更時にはこれを動的に更新します。
    • Trace Flight Recorder: まれなバグをデバッグするために、メモリ内リングバッファへランタイムトレースを継続的に記録する軽量なトレース機能を提供します。
  • ツールとコンパイラ(Tools & Compiler)

    • nil ポインタバグ修正: Go 1.21 から存在していた nil ポインタ検査を遅延させるコンパイラバグが修正され、異常に成功していたコードが今後は正常に panic を起こします。
    • DWARF5 サポート: デバッグ情報に DWARF バージョン 5 を使用し、バイナリサイズとリンク時間を削減しました。
    • 新しい go.mod ignore ディレクティブ: go コマンドが特定のディレクトリを無視するよう設定できます。
  • 標準ライブラリ(Standard Library)

    • testing/synctest パッケージを追加: 並行処理コードのテストを支援する新しいパッケージで、仮想化された時間の中でテストを分離実行できます。
    • crypto パッケージの性能向上: FIPS モードにおける ecdsaed25519 の署名速度が 4 倍に向上し、SHA ハッシュ速度も改善されました。
    • net/http CrossOriginProtection を追加: 最新ブラウザの Fetch メタデータを利用して CSRF 攻撃を防御する新機能を提供します。

ポートとサポートの変更

  • macOS: Go 1.25 から macOS 12 Monterey 以降が必要です。
  • Windows: 32 ビット windows/arm ポートは今回のリリースを最後にサポート終了予定です.

まだコメントはありません。

まだコメントはありません。