Go 1.24の重要な改善点
(gosuda.org)Go 1.24は、性能、セキュリティ、開発者体験に重点を置いたさまざまな改善を導入しており、重要なリリースになりそうです。これらの変更は、Goを現代的なアプリケーション構築において、より強力で効率的なものにすることを目指しています。
性能向上
代表的なベンチマークスイートで、CPUオーバーヘッドを2〜3%削減する全般的な性能向上がありました。これらの改善には、新しい組み込みのmap実装、小さなオブジェクトに対するより効率的なメモリ割り当て、新しいランタイム内部ミューテックス実装が含まれます。結果はアプリケーションによって異なる場合があります。
耐量子暗号
ML-KEM-768およびML-KEM-1024を実装するcrypto/mlkemパッケージが導入されました。ML-KEMは以前はKyberとして知られており、FIPS 203で規定された耐量子鍵交換メカニズムです。これらの追加により、Goは将来の暗号セキュリティに備えることができます。
Encrypted Client Hello
TLSでECH(Encrypted Client Hello)をサポートします。この機能はConfig.EncryptedClientHelloKeysフィールドを設定することで有効化でき、TLS接続のプライバシー保護とセキュリティを強化します。
新しいSwiss Table Map
より良い性能のための改良されたmap実装です。この新しい実装はSwiss Tablesをベースとしており、GOEXPERIMENT=noswissmapビルドフラグを使って無効化できます。
Sync Mapの更新
sync.Mapでmap更新性能が向上しました。分離されたキーセットの更新は、大きなmapにおいて競合が起きる可能性が大幅に低くなり、mapで低競合負荷を実現するために必要だった準備時間も不要になりました。問題が発生した場合は、GOEXPERIMENT=nosynchashtriemapを使用して以前の実装に戻せます。
改善されたJSONマーシャリング
JSONマーシャリング時に、より賢く構造体フィールドを省略するための新しいomitemptyタグオプションです。マーシャリング時にomitemptyオプションを持つ構造体フィールドの値が0であれば省略されます。フィールド型にIsZero() boolメソッドがある場合は、そのメソッドを使って値が0かどうかを判定します。
ランタイムのクリーンアップ
より良いリソース管理のために、SetFinalizerを置き換えるAddCleanup関数が導入されました。SetFinalizerとは異なり、ファイナライゼーションのために関連付けられたオブジェクトを復活させることはなく、単一のオブジェクトに複数のクリーンアップを関連付けることができます。新しいコードではSetFinalizerよりAddCleanupを優先すべきです。
go.modのtoolディレクティブ
go.modのtoolディレクティブにより、ツール依存関係の追跡が改善されました。これにより、従来の回避策であった、慣例的に"tools.go"という名前のファイルにツールをブランクインポートで追加する必要がなくなりました。
ディレクトリ制限付きアクセス
制御されたファイルシステム操作のための新しいos.Root型です。os.Root型は、特定のディレクトリ内でファイルシステム操作を実行する機能を提供し、指定したパス外へのアクセスを防ぎます。
テストの改善
並行コードをテストするための新しいtesting/synctestパッケージです。synctest.Run関数は分離された「バブル」でgoroutineグループを開始し、synctest.Wait関数は現在のバブル内のすべてのgoroutineがブロックされるまで待機します。このパッケージは実験的であり、ビルド時にGOEXPERIMENT=synctestを設定して有効化する必要があります。
ビルドキャッシュ
go runの実行ファイルが、より高速な実行のためにキャッシュされるようになりました。これにより、キャッシュサイズが大きくなる代わりに、繰り返し実行がより高速になります。
Cgo性能
より良いCgo性能のための新しい#cgo noescapeおよび#cgo nocallbackアノテーションです。#cgo noescape cFunctionNameは、C関数に渡されたメモリがエスケープしないことをコンパイラに伝えます。#cgo nocallback cFunctionNameは、C関数がGo関数をコールバックしないことをコンパイラに伝えます。
弱参照ポインタ
回収を妨げることなくメモリを安全に参照するための弱参照ポインタのサポートです。弱参照ポインタは、値の関連付けのための弱参照map、正規化map、さまざまな種類のキャッシュといった、メモリ効率の高い構造を作成できるようにする低レベルの基本要素として提供されます。
ベンチマークテストの改善
より高速でエラーの少ないベンチマークのための新しいtesting.B.Loopメソッドです。ベンチマーク関数は-countごとにちょうど1回だけ実行されるため、コストの高いセットアップとクリーンアップのステップは1回しか実行されません。関数呼び出しの引数と結果は保持されるため、コンパイラはループ本体を完全には最適化できません。
Go 1.24は、言語とそのエコシステムのさまざまな側面に大きな改善をもたらす重要なリリースになりそうです。
4件のコメント
Go を使っている方で、何か欲しい機能はありますか?
自分は
.?や??のような演算子と、できればマクロがあればいいなと思います。正直、struct tag は失敗です。
私も個人的にはマクロがぜひあってほしいですね。いつまで
generateしなきゃいけないのか…struct tagがまずい理由が何なのか気になります
ツールの助けを借りにくいのが最大の問題です。
jsonを除けば、自動補完や IntelliSense が効きません。gomodifytagsが登場してからも長いですが、VSC の Go 拡張機能との統合もかなり遅れました。