> Source: https://www.ymotongpoo.com/works/goblog-ja/go1.20/


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

[Go 1.20 is released!](https://go.dev/blog/go1.20) by Robert Griesemer, on behalf of the Go team

本日、Goチームは喜んでGo 1.20をリリースします。[ダウンロードページ](https://go.dev/dl/)から入手できます。

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

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

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

## 言語の変更

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

## ツールの改善

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

## 標準ライブラリへの追加

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

## パフォーマンスの向上

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

[ソースからGoのリリースをビルドする](https://go.dev/doc/install/source)場合、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への実験的サポートが追加されています。

すべての変更点について、より完全で詳細な一覧は[リリースノート全文](https://go.dev/doc/go1.20)を参照してください。

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

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

By Robert Griesemer, on behalf of the Go team

