gopls とは
gopls(Go Please)は Go が公式サポートしている Language Server です。現在開発が活発に進んでおり 2020年2月9日時点 での最新バージョンは v0.3.1 となっています。
VSCode の Go拡張 における Language Server について
元々 VSCode の Go拡張である microsoft/vscode-go のデフォルトの Language Server は sourcegraph/go-langserver だったのですが、go-langserver の内部で利用されていた nsf/gocode の開発終了を受け、こちら で話し合いがなされた末に 2019年3月に gopls へ 変更 となりました。
なお、2020年2月9日時点での vscode-go の最新バージョン v0.13.0 では、Language Server の使用が デフォルト無効化 となっているので使用したい場合には有効化する必要があります。
Language Server の有効化方法
マニュアル に従い VSCode で以下の作業を実施します。
VSCode に vscode-go がインストールされていない方はインストールを終えた後で実施してください。
1. Language Server の有効化
Code > Preferences > Settings (cmd+,) を開き go.useLanguageServer
を検索して有効化する。
2. gopls のインストール
View > Command Palette (cmd+shift+P) を開き Go: Install/Update Tools
を検索した後で gopls
を選択してインストールする。
gopls v0.3.1 がインストールされました。
$ gopls version
golang.org/x/tools/gopls v0.3.1
golang.org/x/tools/gopls@v0.3.1 h1:yNTWrf4gc4Or0UecjOas5pzOa3BL0WDDyKDV4Wz5VaM=
3. 任意の設定を適用
こちらは任意なのでスキップしても問題ないです。
View > Command Palette (cmd+shift+P) を開き Preferences: Open Settings (JSON)
を検索して settings.json に任意の設定を適用する。こちら を参考にして以下の設定を適用した例となります。
// For gopls
"go.useLanguageServer": true,
"[go]": {
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": true,
},
// Optional: Disable snippets, as they conflict with completion ranking.
"editor.snippetSuggestions": "none",
},
// Global settings for gopls
// https://github.com/golang/tools/blob/master/gopls/doc/settings.md
"gopls": {
// === Officially supported Settings ===
// This controls the information that appears in the hover text.
"hoverKind": "SynopsisDocumentation",
// If true, then completion responses may contain placeholders for function parameters or struct fields.
"usePlaceholders": true,
// This controls where points documentation for given package in `textDocument/documentLink`.
"linkTarget": "pkg.go.dev",
// === Experimental Settings ===
// If true, it enables the use of the staticcheck.io analyzers.
// Warning: This will significantly increase memory usage.
"staticcheck": false,
// If false, indicates that the user does not want documentation with completion results.
"completionDocumentation": true,
// If true, the completion engine is allowed to make suggestions for packages that you do not currently import.
"completeUnimported": true,
// If true, this turns on the ability to return completions from deep inside relevant entities, rather than just the locally accessible ones.
"deepCompletion": true
}
4. 設定の適用
設定を適用するために VSCode を Reload する。これにより Language Server が有効化されます。開発が捗りそうです。
おまけ: Go のコード補完ツールの歴史
Big Sky :: gocode やめます(そして Language Server へ) がとてもわかりやすく非常に参考になったので、理解するがてら時系列を整理してみました。現時点では gopls を利用していくのが良さそうです。
- Go 1.10 以前は gocode がデファクトスタンダード
- Go 1.10 に追加されたビルドキャッシュの関係で gocode の開発が終了
- それと同時に gocode を利用していた go-langserver の開発にも影響が出た
- これらの状況を受けて gocode の fork で mdempsky/gocode や stamblerre/gocode が登場
- Go の公式 Language Server として golsp が登場(stamblerre/gocode の人が開発を担当)
- 別の Go の Language Server として saibing/bingo が登場
- golsp 開発者が bingo 開発者にコラボレーションしようと 打診 する
- golsp が gopls(Go Please) に rename される
- コラボレーションが了承されて golang/tools を fork し bingo の機能を gopls に移植した saibing/tools が登場