Goブログ

Go 11周年

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

本日は、Goオープンソースリリースの11周年を祝います。Goの10周年を祝ったパーティーは、遠い昔のことのように感じます。大変な1年でしたが、Goの開発を前進させ、多くのハイライトを積み重ねてきました。

11月には、Goの10周年直後にgo.devとpkg.go.devをリリースしました。

2月には、Go 1.14リリースで、正式に「本番環境対応」となったGoモジュールの最初の導入と、高速化されたdefer協調的でないゴルーチンのプリエンプションなど、スケジューリングとガベージコレクションのレイテンシを削減する多くのパフォーマンス改善が提供されました。

3月上旬には、プロトコルバッファ用の新しいAPIgoogle.golang.org/protobufをリリースし、プロトコルバッファのリフレクションとカスタムメッセージのサポートを大幅に改善しました。

パンデミックが発生した際、春にはすべての人の注意が当然のことながら他の場所に向いていることを認識し、公表やリリースを一時停止することにしました。しかし、私たちは働き続け、私たちのチームメンバーの1人がプライバシー保護型の接触通知に関するApple/Googleの共同作業に参加し、世界中の接触追跡活動を支援しました。5月には、Goで記述された参照バックエンドサーバーをリリースしました。

多くのエディタで高度なGo対応サポートを可能にするgoplsを改良し続けました。6月には、VSCode Go拡張機能が正式にGoプロジェクトに参加し、現在はgoplsに取り組んでいるのと同じ開発者によって保守されています。

6月には、皆様からのフィードバックのおかげで、pkg.go.devの背後にあるコードもGoプロジェクトの一部としてオープンソース化しました。

6月下旬には、ジェネリックスの最新の設計ドラフトと、プロトタイプツールとジェネリックスプレイグラウンドをリリースしました。

7月には、将来の変更に関する3つの新しい設計ドラフトを発表し、議論しました。 ファイル選択のための新しい//go:buildファイルシステムインターフェースビルド時のファイル埋め込みです。(下記のように、これらはすべて2021年に公開予定です。)

8月には、Go 1.15リリースでは、主に最適化とバグ修正が提供され、新機能はほとんどありませんでした。最も重要なのは、リンカーの書き換えを開始したことで、大規模なビルドにおいて平均で20%高速化され、メモリ使用量が30%削減されたことです。

先月、年間Goユーザー調査を実施しました。分析が完了したら、その結果をブログに投稿します。

Goコミュニティは、他のすべての人々と同様に「バーチャルファースト」に適応し、今年は多くのバーチャルミートアップと10以上のバーチャルGoカンファレンスが行われました。先週、GoチームはGoogle Open Source LiveでGoデーを開催しました(ビデオはリンク先を参照)。

今後の展望

Goの12周年についても、非常に楽しみにしています。最も差し迫っているのは、今週、GoチームメンバーがGopherCon 2020で8つのイベントを発表することです。カレンダーに書き込んでおきましょう!

Goリリース

2月には、Go 1.16リリースに、新しいファイルシステムインターフェースビルド時のファイル埋め込みが含まれます。リンカーの書き換えが完了し、パフォーマンスがさらに向上します。また、新しいApple Silicon(GOARCH=arm64)Macのサポートも含まれます。

8月には、Go 1.17リリースで、さらに多くの機能と改善が提供されるでしょう。ただし、時期はまだ先であるため、具体的な詳細はまだ不明です。x86-64向けの新しいレジスタベースの呼び出し規約(既存のアセンブリを壊すことなく!)が含まれ、プログラム全体が高速化されます。(他のアーキテクチャは、後のリリースで対応します。)確実に含まれる優れた機能の1つに、新しい//go:buildがあり、現在の// +buildよりもエラーが発生しにくいです。来年ベータテストの準備が整うことを期待しているもう1つの非常に期待されている機能は、go testコマンドでのファジングのサポートです。

Goモジュール

今後1年間は、Goモジュールのサポート開発と、Goエコシステム全体への統合を継続します。Go 1.16には、これまでで最もスムーズなGoモジュールエクスペリエンスが含まれます。最近の調査の予備的な結果として、ユーザーの96%がGoモジュールを採用しています(1年前の90%から増加)。

また、GOPATHベースの開発のサポートを最終的に終了します。標準ライブラリ以外の依存関係を使用するプログラムには、go.modが必要です。(まだモジュールに切り替えていない場合は、GOPATH wikiページで、GOPATHからモジュールへの移行の最終ステップの詳細を確認してください)。

当初から、Goモジュールの目標は、「Go開発者とツールの両方の作業語彙にパッケージバージョンの概念を追加すること」であり、Goエコシステム全体でモジュールとバージョンを深くサポートできるようにすることでした。Goモジュールミラー、チェックサムデータベース、インデックスは、パッケージバージョンとは何かというエコシステム全体の理解によって実現しました。今後1年間で、より多くのツールとシステムに豊富なモジュールサポートが追加されるでしょう。たとえば、モジュール作成者が新しいバージョン(go release)を公開するのを支援する新しいツール、およびモジュールコンシューマーが非推奨のAPIから移行するためのコードを更新するのを支援する新しいツール(新しいgo fix)を調査する予定です。

より大規模な例として、goplsを作成して、Goサポートに使用される多くのエディタツール(モジュールをサポートしていないもの)を、モジュールをサポートする単一のツールに減らしました。今後1年間で、VSCode Go拡張機能でデフォルトでgoplsを使用できるようにし、すぐに優れたモジュールエクスペリエンスを実現し、gopls 1.0をリリースする予定です。もちろん、goplsの優れた点の1つは、エディタに依存しないことです。言語サーバープロトコルを理解しているエディタであれば、使用できます。

バージョン情報のもう1つの重要な用途は、ビルド内のどのパッケージに既知の脆弱性があるかを追跡することです。今後1年間は、既知の脆弱性のデータベースと、そのデータベースに対してプログラムをチェックするツールの開発を計画しています。

Goパッケージ検出サイトpkg.go.devは、Goモジュールによって有効になっているバージョン対応システムのもう1つの例です。本日リリースされるリデザインなど、コア機能とユーザーエクスペリエンスを重視してきました。今後1年間で、godoc.orgをpkg.go.devに統合します。また、各パッケージのバージョンのタイムラインを拡張し、各バージョンでの重要な変更、既知の脆弱性などを表示して、依存関係の追加に関する情報に基づいた意思決定を行うために必要な情報を提供するという全体的な目標に従います。

GOPATHからGoモジュールへの移行が完了に近づき、Goモジュールによって実現される優れた依存関係対応ツールをすべて目にできることを楽しみにしています。

ジェネリックス

誰もが気になっている次の機能は、もちろんジェネリックスです。上記のように、6月にジェネリックスの最新の設計ドラフトを公開しました。それ以来、荒削りを洗練し、本番環境対応バージョンの実装の詳細に注意を払ってきました。2021年を通してこれに取り組み、年末までに、Go 1.18ベータ版の一部として、人々が試せるものを作成することを目標としています。

感謝の言葉!

Goは、GoogleのGoチームだけのものだけではありません。Goリリースとツールで協力して作業してくれた貢献者の方々に感謝しています。それ以外にも、Goは、Goの繁栄するエコシステムで働き、貢献してくれた皆様のおかげで成功しています。Goの外の世界では困難な1年でした。これまで以上に、皆様が時間を取って私たちに加わり、Goの成功に貢献してくれたことに感謝しています。ありがとうございました。皆様が安全に過ごされ、すべてがうまくいくことを願っています。

次の記事:godoc.orgのリクエストをpkg.go.devにリダイレクトする
前の記事:Pkg.go.devが新しいルックになりました!
ブログインデックス