Go ブログ

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

Go チームを代表して、Robert Griesemer
2023年2月1日

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

Go 1.20 は、早期の広範なテストとコードベースの全体的な安定性の向上により、開発期間が延長されました。

特に、プロファイルガイド付き最適化(PGO)のプレビューを開始できることに興奮しています。これにより、コンパイラは実行時プロファイル情報に基づいて、アプリケーションおよびワークロード固有の最適化を実行できます。go build にプロファイルを提供することで、コンパイラは一般的なアプリケーションを約 3 ~ 4% 高速化できます。今後リリースでは、PGO からさらに大きな恩恵を受けると予想しています。これは PGO サポートのプレビューリリースであるため、試していただくことを推奨しますが、まだ実運用を妨げる可能性のある粗削りな部分があります。

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

言語の変更

  • 事前宣言された comparable 制約は、インターフェースなどの通常の 比較可能な型によっても 満たされるようになり、ジェネリックコードが簡素化されます。
  • 関数 SliceDataString、および StringData がパッケージ unsafe に追加されました。これらは、実装に依存しないスライスと文字列の操作のための関数セットを完成させます。
  • 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 を介した楕円曲線ディフィー・ヘルマン鍵交換を明示的にサポートします。
  • 新しい関数 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 は可能な限り安定したものになりました。 いつものように、何か問題に気づいた場合は、問題を報告してください。

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

次の記事:プロファイルガイド付き最適化のプレビュー
前の記事:Go を使用した開発に関するフィードバックを共有してください
ブログインデックス