GoSuda

Go 1.24 リリース概要:Swiss Table マップ、ML-KEM、os.Root、testing/synctest

By Lemon Mint views ...

Go 1.24は、パフォーマンス、セキュリティ、開発者体験に焦点を当てた幅広い機能強化を導入する、重要なリリースとなる見込みです。これらの変更は、最新のアプリケーションの構築において、Goをさらに強力かつ効率的なものにすることを目指しています。

パフォーマンスの向上

代表的なベンチマークスイート全体でCPUオーバーヘッドが2~3%削減される、全般的なパフォーマンス改善です。これらの改善には、新しい組み込みマップ実装、小さなオブジェクトのより効率的なメモリ割り当て、およびランタイム内部で使用される新しいミューテックス実装が含まれます。結果はアプリケーションによって異なる場合があります。

ポスト量子暗号

crypto/mlkemパッケージの導入であり、ML-KEM-768およびML-KEM-1024を実装しています。ML-KEMは、以前はKyberとして知られ、FIPS 203で規定されているポストクアンタム鍵交換メカニズムです。この追加により、Goは暗号セキュリティの将来に備えることができます。

TLSの機能強化

TLSにおけるEncrypted Client Hello(ECH)のサポートです。この機能は、Config.EncryptedClientHelloKeysフィールドに値を設定することで有効化でき、TLS接続のプライバシーとセキュリティを強化します。

新しいSwiss Tableマップ

パフォーマンス向上を目的とした、強化されたマップ実装です。この新しい実装はSwiss Tablesに基づいており、GOEXPERIMENT=noswissmapビルドフラグで無効化できます。

Sync Mapの更新

sync.Mapにおけるマップ変更のパフォーマンスが改善されました。互いに素なキーの集合に対する変更は、大規模なマップにおいて競合が発生する可能性が大幅に低減され、マップから低競合での読み取りを実現するために必要だったウォームアップ時間も不要になりました。問題が発生した場合は、GOEXPERIMENT=nosynchashtriemapを使用して旧実装に戻すことができます。

JSONマーシャリングの強化

構造体フィールドをJSONマーシャリング時により賢く省略するための新しいomitemptyタグオプションです。マーシャリング時に、omitemptyオプションを持つ構造体フィールドは、その値がゼロ値である場合に省略されます。フィールドの型がIsZero() boolメソッドを持つ場合、値がゼロであるかどうかの判定にそのメソッドが使用されます。

ランタイムのクリーンアップ

リソース管理を改善するため、SetFinalizerに代わるAddCleanup関数が導入されました。SetFinalizerとは異なり、アタッチされたオブジェクトをファイナライズのために復活させることはなく、単一のオブジェクトに複数のクリーンアップをアタッチできます。新しいコードでは、SetFinalizerよりもAddCleanupの使用が推奨されます。

go.modにおけるツールディレクティブ

go.modのツールディレクティブを用いた、実行可能な依存関係の追跡が改善されました。これにより、従来「tools.go」という慣例的な名前のファイルにツールを空白インポートとして追加していた回避策が不要になります。

ディレクトリ制限付きアクセス

制御されたファイルシステム操作のための新しいos.Root型です。os.Root型は、特定のディレクトリ内でファイルシステム操作を実行する機能を提供し、指定されたパスの外へのアクセスを防止します。

テストの改善

並行コードのテストを行うための新しいtesting/synctestパッケージです。synctest.Run関数は、隔離された「バブル」内でゴルーチンのグループを開始し、synctest.Wait関数は、現在のバブル内のすべてのゴルーチンがブロックするまで待機します。このパッケージは実験的なものであり、ビルド時にGOEXPERIMENT=synctestを設定して有効化する必要があります。

ビルドキャッシュ

go runの実行可能ファイルがキャッシュされるようになり、実行が高速化されました。これにより、繰り返し実行が高速になりますが、その代償としてキャッシュが大きくなります。

Cgoのパフォーマンス

Cgoのパフォーマンス向上のための新しい#cgo noescapeおよび#cgo nocallbackアノテーションです。#cgo noescape cFunctionNameは、C関数に渡されたメモリがエスケープしないことをコンパイラに伝えます。#cgo nocallback cFunctionNameは、C関数がGo関数を呼び出し返さないことをコンパイラに伝えます。

弱いポインタ

メモリの回収を妨げることなく、安全にメモリを参照するための弱いポインタのサポートです。弱いポインタは、値を関連付けるための弱いマップ、正規化マップ、さまざまな種類のキャッシュなど、メモリ効率の高い構造の作成を可能にするために提供される低レベルのプリミティブです。

ベンチマークの改善

より高速で、誤りが起こりにくいベンチマークのための新しいtesting.B.Loopメソッドです。ベンチマーク関数は-countごとに正確に1回実行されるため、高コストなセットアップおよびクリーンアップの処理は一度だけ実行されます。関数の呼び出しパラメータと結果は生存状態に保たれ、コンパイラがループ本体を完全に最適化により除去することを防ぎます。

Go 1.24は、言語およびそのエコシステムのさまざまな側面で大幅な改善をもたらす、重要なリリースとなる見込みです。

Go 1.24の概要