Go 1.20がリリースされました

Go 1.20 is released! by Robert Griesemer, on behalf of the Go team

本日、Goチームは喜んでGo 1.20をリリースします。ダウンロードページから入手できます。

Go 1.20は、これまでの幅広いテストと、コードベース全体の安定性の向上のおかげで、開発期間を延長できました。

特にお伝えしたいのは、プロファイルガイド最適化(PGO)のプレビュー版を公開できたことです。PGOはコンパイラに、実行時のプロファイル情報に基づいたアプリケーション固有かつワークロード固有の最適化を行わせる機能です。go build にプロファイルを渡すことで、典型的なアプリケーションを約3〜4%高速化でき、今後のリリースではPGOの恩恵をさらに大きく受けられるようになる見込みです。今回はPGOサポートのプレビューリリースであるため、ぜひ試していただきたい一方で、本番利用を妨げるような粗削りな部分もまだ残っています。

Go 1.20にはこのほか、いくつかの言語の変更や、ツールおよびライブラリに対する数多くの改善、全体的なパフォーマンスの向上も含まれています。

言語の変更

  • あらかじめ宣言されているcomparable制約は、インターフェースなどの通常の比較可能な型によっても満たされるようになりました。これによりジェネリックなコードを簡潔に書けるようになります。
  • unsafeパッケージに SliceDataStringStringData の各関数が追加されました。これにより、実装に依存しない形でスライスや文字列を操作するための関数群が揃いました。
  • Goの型変換規則が拡張され、スライスから配列への直接変換が可能になりました。
  • 言語仕様では、配列の要素や構造体のフィールドが比較される際の正確な順序が定義されるようになりました。これにより、比較中にパニックが発生した場合の挙動が明確になります。

ツールの改善

  • cover ツールは、ユニットテストだけでなく、プログラム全体のカバレッジプロファイルを収集できるようになりました。
  • go ツールは、$GOROOT/pkg ディレクトリ内にある事前コンパイル済みの標準ライブラリのパッケージアーカイブに依存しなくなり、配布物にも含まれなくなったため、ダウンロードサイズが小さくなりました。代わりに、標準ライブラリ内のパッケージは、他のパッケージと同様に、必要に応じてビルドされビルドキャッシュに格納されるようになりました。
  • go test -json の実装が改善され、stdout への予期しない書き込みが発生してもより堅牢に動作するようになりました。
  • go buildgo install、その他のビルド関連コマンドは、プロファイルガイド最適化を有効にする -pgo フラグと、プログラム全体のカバレッジ解析を行う -cover フラグを受け付けるようになりました。
  • go コマンドは、Cツールチェインが存在しないシステムではデフォルトで cgo を無効化するようになりました。その結果、CコンパイラのないシステムにインストールされたGoは、cgoをオプションで使用する標準ライブラリのパッケージについて、(前述の通りすでに削除されている)事前配布済みのパッケージアーカイブの代わりに、純粋なGoによるビルドを使うようになります。
  • vet ツールは、並行実行されるテストで起こりうるループ変数の参照ミスを、より多く報告するようになりました。

標準ライブラリへの追加

  • 新しい crypto/ecdh パッケージは、NIST曲線およびCurve25519上での楕円曲線Diffie-Hellman鍵交換を明示的にサポートします。
  • 新しい関数 errors.Join は、複数のエラーのリストをラップしたエラーを返します。このエラー型が Unwrap() []error メソッドを実装していれば、ラップされたエラーのリストを再び取得できます。
  • 新しい http.ResponseController 型は、http.ResponseWriter インターフェースでは扱えない、リクエストごとの拡張機能へのアクセスを提供します。
  • httputil.ReverseProxy フォワーディングプロキシに、従来の Director フックを置き換える新しい Rewrite フック関数が追加されました。
  • 新しい関数 context.WithCancelCause は、指定したエラーとともにコンテキストをキャンセルする方法を提供します。このエラーは、新しい関数 context.Cause を呼び出すことで取得できます。
  • os/exec.Cmd の新しいフィールド CancelWaitDelay は、関連付けられた Context がキャンセルされたとき、あるいはプロセスが終了したときの Cmd の挙動を指定します。

パフォーマンスの向上

  • コンパイラとガベージコレクタの改善により、メモリのオーバーヘッドが削減され、全体的なCPU性能が最大2%向上しました。
  • コンパイル時間を対象とした取り組みにより、ビルドが最大10%高速化しました。これによりビルド速度はGo 1.17の水準まで回復しました。

ソースからGoのリリースをビルドする場合、Go 1.20にはGo 1.17.13以降のリリースが必要です。今後は、ブートストラップ用ツールチェインをおよそ1年に一度のペースで新しくしていく予定です。また、Go 1.21以降では、一部の古いオペレーティングシステムのサポートが打ち切られます。対象となるのはWindows 7、8、Server 2008、Server 2012、macOS 10.13 High Sierra、10.14 Mojaveです。一方でGo 1.20では、RISC-V版FreeBSDへの実験的サポートが追加されています。

すべての変更点について、より完全で詳細な一覧はリリースノート全文を参照してください。

コードを書き、バグを報告し、フィードバックを共有し、リリース候補版をテストすることでこのリリースに貢献してくださったすべての方に感謝します。皆さんの努力のおかげで、Go 1.20はできる限り安定した状態に仕上がりました。いつものように、何か問題に気づいた場合はIssueを作成してください

Go 1.20をお楽しみください!

By Robert Griesemer, on behalf of the Go team