- Go 1.22 は、Go 1.21 の6か月後にリリースされた。
- 変更の大半は、ツールチェーン、ランタイム、ライブラリの実装にある。
- Go 1 の互換性の約束は維持されており、ほぼすべての Go プログラムはこれまで通りコンパイルおよび実行できると見込まれる。
言語の変更点
for ループには2つの変更がある。
- これまで
for ループで宣言された変数は1回だけ生成され、各反復で更新されていたが、Go 1.22 ではループの各反復ごとに新しい変数が生成されるため、意図せず共有してしまうバグを防げる。
for ループで整数に対して範囲指定できるようになった。
ツール
Go コマンド
- ワークスペースで
vendor ディレクトリを使って依存関係を管理できる。
go get は、モジュールではない従来の GOPATH モードでは今後サポートされない。
go mod init は、他の vendoring ツールの設定ファイルからモジュール要件を取り込もうとしなくなった。
go test -cover は、自前のテストファイルを持たないパッケージについてもカバレッジの要約を出力するようになった。
Trace
trace ツールの Web UI は、新しいトレーサーをサポートするために一部再設計された。
Vet
- ループ変数に対する
vet ツールの動作が変更された。
append に値を追加していない呼び出しに対する新しい警告が追加された。
time.Since を defer 文で使う際に起きる問題に対する新しい警告が追加された。
log/slog 呼び出しでキーと値の組が一致しない場合の新しい警告が追加された。
ランタイム
- 型ベースのガベージコレクション用メタデータをヒープオブジェクトの近くに保持することで、CPU 性能が 1〜3% 向上した。
コンパイラ
- プロファイルガイド最適化(PGO)ビルドで、以前より多くの呼び出しをデバーチャライズできるようになった。
リンカ
- リンカの
-s および -w フラグが、すべてのプラットフォームでより一貫して動作するように変更された。
ブートストラップ
- Go 1.22 は、ブートストラップのために Go 1.20 の最終ポイントリリース以降を必要とする。
コアライブラリ
新しい math/rand/v2 パッケージ
math/rand/v2 は標準ライブラリ初の「v2」パッケージであり、math/rand と比べていくつかの重要な変更がある。
新しい go/version パッケージ
- Go のバージョン文字列を検証・比較する関数を実装した新しい
go/version パッケージが追加された。
強化されたルーティングパターン
- 標準ライブラリの HTTP ルーティングが、より表現力豊かになるよう改善された。
ライブラリの細かな変更点
- さまざまなライブラリに細かな変更と性能向上がある。
ポート
Darwin
- macOS の 64 ビット x86 アーキテクチャ(
darwin/amd64 ポート)では、Go ツールチェーンがデフォルトで位置独立実行ファイル(PIE)を生成するようになった。
Arm
GOARM 環境変数を使って、ソフトウェア浮動小数点またはハードウェア浮動小数点を選択できる。
Loong64
loong64 ポートでは、関数の引数と戻り値をレジスタで受け渡しするようになった。
OpenBSD
- OpenBSD において、ビッグエンディアン 64 ビット PowerPC(
openbsd/ppc64)向けの実験的ポートが追加された。
GN⁺ の見解
- 今回の Go 1.22 リリースでは、特に
for ループの変更点と新しい math/rand/v2 パッケージの導入が注目に値する。これらの変更は Go 開発者により良い性能と安定性をもたらし、新機能は Go 言語の進化を反映している。
math/rand/v2 パッケージは、より高速なアルゴリズムと新しい API により、より優れた乱数生成機能を提供する。これは暗号化やその他の乱数依存アプリケーションにとって重要な改善である。
- Go 1.22 は、互換性を維持しつつ性能と開発者体験を向上させるさまざまな最適化と新機能を提供することで、Go コミュニティに前向きな影響を与えると期待される。
1件のコメント
Hacker Newsの意見
io.CopyがTCPConnからUnixConnへコピーする際に、Linuxのsplice(2)システムコールを使えるようになった。ioパッケージにおけるこの種のパターンから得られる利点を高く評価している。httpmuxgo121フィールドで制御できる。sql.Null[T]の追加を歓迎。従来はsqlboilerのnullを使っていたが、sql.Nullに似たAPIを持ち、さらに値が明示的に設定されたかどうかを示すIsSet() boolメソッドがある。chiライブラリを削除できるか検討中。anyキーワードの使用についての意見も交わされている。