Go 1.24の新機能
Go 1.24は、パフォーマンス、セキュリティ、開発者エクスペリエンスに焦点を当てた幅広い機能強化を導入し、重要なリリースとなりつつあります。これらの変更は、Goを現代のアプリケーション構築においてさらに強力かつ効率的にすることを目指しています。
パフォーマンス向上
代表的なベンチマークスイート全体でCPUオーバーヘッドが2〜3%削減されるなど、全体的なパフォーマンスが向上しました。これらの改善には、新しい組み込みmapの実装、小規模オブジェクトのより効率的なメモリ割り当て、および新しいランタイム内部mutexの実装が含まれます。結果はアプリケーションによって異なる場合があります。
ポスト量子暗号
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 Map
パフォーマンスを向上させるための強化されたmap実装。この新しい実装はSwiss Tablesに基づいており、GOEXPERIMENT=noswissmap
ビルドフラグを使用して無効にすることができます。
Sync Mapの更新
sync.Map
におけるmap変更のパフォーマンスが向上しました。独立したキーセットの変更は、大規模なmapにおいて競合する可能性が大幅に低くなり、mapからの低競合ロードを実現するために必要なウォームアップ時間はなくなりました。問題が発生した場合は、GOEXPERIMENT=nosynchashtriemap
を使用して古い実装に戻すことができます。
JSONマーシャリングの強化
JSONマーシャリング中のよりスマートなstructフィールド省略のための新しいomitempty
タグオプション。マーシャリング時に、omitempty
オプションを持つstructフィールドは、その値がゼロの場合に省略されます。フィールド型に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回実行されるため、コストのかかるセットアップとクリーンアップのステップは1回だけ実行されます。関数呼び出しのパラメータと結果は維持され、コンパイラがループ本体を完全に最適化して削除することを防ぎます。
Go 1.24は、言語とそのエコシステムの様々な側面において大幅な改善をもたらし、重要なリリースとなりつつあります。