The Go Blog

Goの14年間

Goチームを代表して、Russ Cox
2023年11月10日

本日、Goオープンソースリリースの14回目の誕生日を祝います!Goは、機能満載の2つのリリースとその他の重要なマイルストーンを達成し、素晴らしい一年となりました。

2月にGo 1.20、8月にGo 1.21をリリースし、新しい言語の変更よりも実装の改善に重点を置きました。

プロファイルガイド付き最適化 (PGO) は、Go 1.20でプレビューされ、Go 1.21でリリースされました。これにより、Goコンパイラはプログラムのプロファイルを読み取り、最も頻繁に実行されるプログラムの部分の最適化により多くの時間を費やすことができます。Go 1.21では、PGOを有効にすることで、ワークロードのCPU使用率が通常2%から7%改善されます。概要については、「Go 1.21でのプロファイルガイド付き最適化」を、完全なドキュメントについてはプロファイルガイド付き最適化ユーザーガイドを参照してください。

Goは、Go 1.2以降、`go test`中にカバレッジプロファイルを収集するサポートを提供してきました。Go 1.20では、`go build`によって構築されたバイナリでカバレッジプロファイルを収集するサポートが追加され、より大規模な統合テスト中にもカバレッジを収集できるようになりました。詳細については、「Go統合テスト用のコードカバレッジ」を参照してください。

互換性は、「Go 1とGoプログラムの未来」以来、Goの重要な部分です。Go 1.21では、重要なバグ修正など、許可されるべきだが既存のプログラムを壊す可能性のある変更を行う必要がある状況でGODEBUGを使用するための慣例を拡張することで、互換性をさらに改善しました。概要については、ブログ記事「後方互換性、Go 1.21、およびGo 2」を、詳細についてはドキュメント「Go、後方互換性、およびGODEBUG」を参照してください。

Go 1.21では、組み込みのツールチェーン管理のサポートも出荷されました。これにより、他の依存関係のバージョンを変更するのと同じくらい簡単に、特定のモジュールで使用するGoツールチェーンのバージョンを変更できます。概要については、ブログ記事「Go 1.21における前方互換性とツールチェーン管理」を、詳細についてはドキュメント「Goツールチェーン」を参照してください。

もう1つの重要なツール開発は、Go LSPサーバーであるgoplsへのオンディスクインデックスの統合でした。これにより、一般的な使用例でgoplsの起動遅延とメモリ使用量が3〜5倍削減されました。「成長するGoエコシステム向けにgoplsをスケーリングする」で技術的な詳細が説明されています。次のコマンドを実行することで、最新のgoplsが実行されていることを確認できます。

go install golang.org/x/tools/gopls@latest

Go 1.21では、新しいcmpmaps、およびslicesパッケージ(Go初の汎用標準ライブラリ)が導入され、比較可能な型のセットも拡張されました。詳細については、ブログ記事「すべての比較可能な型」を参照してください。

全体として、ジェネリクスを改良し続け、重要な詳細を説明する講演やブログ記事を書き続けています。今年の注目すべき2つの記事は、「型パラメータを分解する」と「型推論について知りたかったことすべて - そしてもう少し」でした。

Go 1.21のもう1つの重要な新しいパッケージはlog/slogです。これは、標準ライブラリに構造化ロギングの公式APIを追加します。概要については、「slogによる構造化ロギング」を参照してください。

WebAssembly (Wasm) ポートでは、Go 1.21はWebAssembly System Interface (WASI) プレビュー1での実行のサポートを出荷しました。WASIプレビュー1は、ほとんどのサーバーサイドWasm環境でサポートされているWasm用の新しい「オペレーティングシステム」インターフェースです。ウォークスルーについては、「GoにおけるWASIサポート」を参照してください。

セキュリティ面では、7月にGovulncheck 1.0をリリースし、開発者が依存関係と脆弱性を理解できるようにGoが先導し続けていることを確認しています。VS Codeを使用している場合は、Go拡張機能を使用してエディタで直接govulncheckを実行できます。開始するには、このチュートリアルを参照してください。GitHubを使用している場合は、govulncheck用GitHubアクションを使用して、CI/CDの一部としてgovulncheckを実行できます。脆弱性の問題について依存関係をチェックする方法の詳細については、今年のGoogle I/Oの講演「GoとGoogleでより安全なアプリを構築する」を参照してください。

もう1つの重要なセキュリティマイルストーンは、Go 1.21の再現性の高いツールチェーンビルドでした。Linuxツールを一切使用せずにMacでUbuntu Linux Goツールチェーンを再現するデモンストレーションを含む詳細については、「完全に再現可能で検証済みのGoツールチェーン」を参照してください。

忙しい一年でした!

Goの15年目には、Goを大規模なソフトウェアエンジニアリングに最適な環境にするために引き続き取り組んでいきます。特に楽しみにしている変更の1つは、偶発的なエイリアシングバグの可能性を排除するために、forループの:=セマンティクスを再定義することです。Go 1.21でこの変更をプレビューする手順を含む詳細については、「Go 1.22でのForループの修正」を参照してください。

ありがとうございました!

Goプロジェクトは、GoogleのGoチームだけでなく、常にそれ以上の存在でした。Goを今日の姿にしてくれたすべての貢献者とGoコミュニティの皆様に感謝いたします。皆様の今後のご活躍をお祈り申し上げます。

次の記事: Go開発者調査2023年下半期の結果
前の記事: 型推論について知りたかったことすべて - そしてもう少し
ブログインデックス