Goplsリリース v0.16.0

go install golang.org/x/tools/gopls@v0.16.2

このリリースには、いくつかの機能とバグ修正が含まれており、Go 1.23をサポートするgoplsの最初のバージョンです。インストールするには、次を実行します。

新しいサポートポリシー。Go 1.19とGo 1.20のサポート終了

要するに:goplsのサポート期間を短縮しますが、goplsをビルドするために少なくともGo 1.21を使用している限り、この変更があなたに影響する可能性は低いでしょう。これは、あなたが書いているコードに対するgoplsのサポートには影響しません。

これは、Go 1.19またはGo 1.20でビルドできるgoplsの最後のリリースであり、goコマンドバージョン1.19および1.20との統合をサポートする最後のリリースでもあります。これらのGoバージョンでビルドまたは使用された場合、ユーザーにアップグレードを促すメッセージが表示されます。

goplsを使用する場合、認識すべき3つのバージョンがあります。

  1. goplsビルドGoバージョン:goplsのビルドに使用されるGoのバージョン。
  2. goコマンドバージョン:goplsがワークスペースに関する情報をロードするために実行するgo listコマンドのバージョン。
  3. 言語バージョン:現在のファイルの囲むgo.modファイルのgoディレクティブのバージョンで、ファイルのGo言語セマンティクスを決定します。

このgoplsリリース v0.16.0は、Go 1.19およびGo 1.20をgoplsビルドGoバージョンまたはgoコマンドバージョンとしてサポートする最終リリースです。すべての言語バージョンに対するgoplsのサポートには変更はありません。実際、stdversionアナライザーの追加により、このサポートはいくらか改善されました(下記参照)。

8月にGo 1.23.0がリリースされた後にリリースされるgopls@v0.17.0からは、goplsは最新バージョンのGoのみをgoplsビルドGoバージョンとしてサポートします。しかし、Go 1.21に追加された前方互換性のおかげで、Go 1.21以降のユーザーにとっては、他の依存関係と同様に、必要なツールチェーンのアップグレードは自動的に処理されるはずです。さらに、goコマンドバージョンのサポート期間を4バージョンから3バージョンに短縮します。これは、システムにGo 1.21以上がインストールされていれば、gopls@v0.17.0をgo installして使用できることを意味します。

言語バージョンのサポートを変更する予定はありません。goplsは常に任意のGoバージョンをターゲットとするプログラムの開発をサポートすると予想しています。

goplsを最新のGoバージョンでビルドすることに注力することで、メンテナンスの負担を大幅に軽減し、将来のgoplsリリースの安定性を向上させることができます。詳細については、新しく更新されたサポートポリシーを参照してください。この変更にご懸念がある場合は、golang/go#65917にコメントしてください。

設定の変更

  • 実験的なallowImplicitNetworkAccess設定は非推奨になりました(ただし、まだ削除されていません)。この設定を使用しており、削除された場合に影響を受ける場合は、golang/go#66861にコメントしてください。

新機能

Go 1.23のサポート

このバージョンのgoplsは、range-over-funcイテレーターやgo.modファイル内のgodebugディレクティブのサポートなど、Go 1.23の新しい言語機能をサポートする最初のバージョンです。

統合ドキュメントビューア

Goplsは、「ドキュメントをブラウズ」コードアクションを提供するようになりました。これにより、Goパッケージとシンボルの生成されたドキュメントをhttps://pkg.go.devと同様の形式で表示するローカルウェブページが開きます。パッケージまたはシンボルは、現在の選択に基づいて決定されます。

この機能を使用して、API変更を準備する際にマークアップされたドキュメントをプレビューしたり、ローカルで編集されたパッケージ(まだ保存されていないものも含む)のドキュメントを読んだりできます。編集後にページをリロードすると、更新されたドキュメントが表示されます。

pkg.go.devと同様に、各シンボルの見出しには宣言のソースコードへのリンクが含まれています。pkg.go.devでは、これらのリンクはGitHubやGoogle Code Searchのようなサイトのソースコードページを参照しますが、goplsの内部ビューアでは、これらのリンクのいずれかをクリックすると、エディタが宣言に移動します。(この機能には、LSPクライアントがshowDocumentダウンコールを尊重する必要があります。)

エディタのサポート

  • VS Code:「ソースアクション > func fmt.Printlnのドキュメントをブラウズ」メニュー項目を使用します。注意:ソースリンクはエディタをナビゲートしますが、まだウィンドウは起動しません。microsoft/vscode#208093およびmicrosoft/vscode#207634(一時的にクローズ)に賛成票を投じてください。
  • Emacs:eglot v1.17が必要です。github.com/dominikh/go-mode.elからM-x go-browse-docを使用します。

linksInHover設定は、新しい値"gopls"をサポートするようになりました。これにより、Hover操作のMarkdown出力のドキュメントリンクがgoplsの内部ドキュメントビューアにリンクするようになります。

自由シンボルのブラウズ

Goplsは、「自由シンボルをブラウズ」という別のウェブベースのコードアクションを提供します。これは、選択されたコードによって参照される自由シンボルを表示します。

シンボルは、選択範囲内で参照されているが、選択範囲外で宣言されている場合、「自由」です。変数の自由シンボルは、ブロックが独自の関数に抽出された場合に必要となるパラメータのセットとほぼ同じです。

ブロックを新しい関数に抽出するつもりがなくても、この情報はコードブロックがどの名前に依存しているかを一目で把握するのに役立ちます。

識別子の各ドットパス(file.Name.Posなど)は個別の項目として報告されるため、複雑な型の中で実際にどの部分が必要であるかを確認できます。

関数の本体の自由シンボルは、関数のパラメータのほんの一部(例えば、構造体の単一フィールド)しか使用されていないことを明らかにすることができ、そのパラメータの異なる型を選択することで、関数を簡素化し、一般化することができます。

エディタのサポート

  • VS Code:「Source action > Browse free symbols」メニュー項目を使用します。
  • Emacs:eglot v1.17が必要です。github.com/dominikh/go-mode.elからM-x go-browse-freesymbolsを使用します。

アセンブリのブラウズ

Goplsは、「fのアセンブリをブラウズ」という3番目のウェブベースのコードアクションを提供します。これは、選択されたコードを囲む関数fの宣言、および関数リテラルや遅延呼び出しなどのネストされた関数のアセンブリリストを表示します。

Goplsはコンパイラを呼び出してレポートを生成します。ページをリロードするとレポートが更新されます。

マシンアーキテクチャは、goplsが現在のファイルに対して選択するビルド構成によって決定されます。これは通常、異なるアーキテクチャのgo:buildタグを持つファイルで作業していない限り、お使いのマシンのGOARCHと同じです。

Goplsはまだジェネリック関数のアセンブリを表示できません。ジェネリック関数はインスタンス化されるまで完全にコンパイルされませんが、選択範囲を囲む関数宣言はインスタンス化されたジェネリック関数ではありません。

エディタのサポート

  • VS Code:「ソースアクション > fのアセンブリをブラウズ」メニュー項目を使用します。
  • Emacs:eglot v1.17が必要です。github.com/dominikh/go-mode.elからM-x go-browse-assemblyを使用します。

unusedwriteアナライザー

新しいunusedwriteアナライザーは、例えば構造体が二度と使用されないため、効果のない代入(しばしば構造体のフィールドへの代入)を報告します。

func scheme(host string) string {
    u := &url.URL{
        Host:   host, // "unused write to field Host" (no need to construct a URL)
        Scheme: "https:",
    }
    return u.Scheme
}

これはせいぜいコードが不必要に複雑であること(例えば、不要なコードが削除できること)を示すものですが、多くの場合、次の例のようにバグを示しています。

type S struct { x int }

func (s S) set(x int) {
    s.x = x // "unused write to field x" (s should be a *S pointer)
}

stdversionアナライザー

新しいstdversionアナライザーは、go.modファイルのgoディレクティブのバージョンに基づいて、新しすぎる標準ライブラリシンボルの使用について警告します。これにより、goplsが最近のGoバージョンでビルドされている場合でも、古い言語バージョンのサポートが改善されます(上記参照)。

以下のgo.modファイルとGoファイルを検討してください。var aliasの宣言はgo1.22で導入された型types.Aliasを参照していますが、ファイルはgo1.21のみを必要とするモジュールに属しているため、アナライザーは診断を報告します。

module example.com
go 1.21
package p

import "go/types"

var alias types.Alias // types.Alias requires go1.22 or later (module is go1.21)

個々のファイルがモジュールのバージョンとは異なるGoのリリース用にビルドタグ付けされている場合、アナライザーはファイルのバージョンに適したチェックを適用します。

さらに2つのvetアナライザー

framepointerおよびsigchanyzerアナライザーは、長らくgo vetスイートの一部でしたが、以前のgoplsバージョンでは見過ごされていました。

今後、goplsは常にvetによって実行されるすべてのアナライザーを含めます。

Hoverにサイズ/オフセット情報と構造体タグを表示

型または構造体フィールドを宣言する識別子にホバーすると、型のサイズ情報が表示されるようになりました。

フィールドのオフセット情報も表示されます。

さらに、構造体フィールドの最適でない順序付けによる無駄なスペースの割合が20%以上の場合、その割合が報告されます。

上記の構造体では、アライメントルールにより、2つのブールフィールド(1バイト)がそれぞれ完全なワード(8バイト)を占める必要があり、(7 + 7) / (3 * 8) = 58%の無駄が生じます。2つのブールをまとめて配置すると、1ワードを節約できます。

この情報は、データ構造のスペース最適化を行う際や、アセンブリコードを読む際に役立ちます。

また、構造体タグを持つフィールドへの参照にホバーすると、タグも表示されるようになりました。

Hoverと「Go to Definition」がドキュメントコメント内のシンボルで機能するようになりました

Go 1.19でドキュメントリンクのサポートが追加され、あるシンボルのドキュメントコメントから別のシンボルを参照できるようになりました。

GoplsのHoverおよびDefinition操作は、これらのリンクを識別子と同様に扱うようになり、ホバーするとシンボルに関する情報が表示されます。

同様に、「定義へ移動」はその宣言にナビゲートします。この機能の貢献に@rogeryk氏に感謝します。

修正されたバグ

貢献者の皆様に感謝いたします!

unusedwriteアナライザーに@guodongli-google。TODO:彼らは元Google社員です。より現在のGHアカウントはありますか?

@rogeryk


このドキュメントのソースファイルは、golang.org/x/tools/gopls/doc の下にあります。