Gopls release v0.18.0

配置更改

  • hoverKind 選項的實驗性 Structured 值不再受支援。

  • gc_details 程式碼提示已被刪除。(它之前預設是停用的。)現在可以透過 toggleCompilerOptDetails 程式碼操作(下文有說明)來獲得此功能,因為程式碼操作在各種客戶端中的支援程度比程式碼提示更好。

    VS Code 的特殊命令“Go: Toggle GC details”仍然有效。

  • 實驗性的 semanticTokenTypessemanticTokenModifiers 選項允許在 textDocument/semanticTokens 響應中選擇性地停用某些型別的 token 或 token modifiers。

    這些選項取代了現在已棄用的 noSemanticStringnoSemanticTokenNumber 選項。使用者現在可以設定 “semanticTokenTypes”: {“string”: false, “number”: false} 來達到相同的結果。目前,gopls 仍然支援 noSemanticTokenStringnoSemanticToken,但在未來的版本中將停止支援它們。

  • 新的 workspaceFiles 選項允許配置匹配定義工作區邏輯構建檔案的 glob 模式。此選項僅在使用自定義 golang.org/x/tools/go/packages 驅動程式的環境中需要。

新功能

“{顯示,隱藏}編譯器最佳化詳細資訊” 程式碼操作

此程式碼操作可以透過 VS Code 中的“Source Action”選單訪問,它會切換一個每目錄的標誌,導致 Go 編譯器最佳化詳細資訊作為診斷報告。例如,它會指示哪些變數會逃逸到堆中,以及哪些陣列訪問需要邊界檢查。

TODO:為每個專案新增指向完整手冊的連結。

新的 modernize 分析器

Gopls 現在會報告程式碼何時可以透過使用更現代的 Go 功能來簡化或澄清,並提供一個快速修復來應用更改。

例如,使用 if/else 語句的條件賦值可以被 Go 1.18 中新增的 minmax 內建函式呼叫所取代。

使用此命令大規模應用現代化修復

$ go run golang.org/x/tools/gopls/internal/analysis/modernize/cmd/modernize@latest -test ./...

新的 unusedfunc 分析器

Gopls 現在會報告未使用的函式和方法,為你提供關於可安全刪除的死程式碼的近乎即時反饋。由於分析僅限於每個包,只有未匯出的函式和方法是候選者。(要進行更精確的分析,可能報告未使用的已匯出函式,請使用 golang.org/x/tools/cmd/deadcode 命令。)

新的 hostport 分析器

隨著 IPv6 使用的日益廣泛,使用 fmt.Sprintf("%s:%d") 構造“host:port”字串已不再合適,因為主機名可能包含冒號。Gopls 現在會報告以這種方式(或使用 %s 作為埠)構造的字串傳遞給 net.Dial 或相關函式的地方,並提供一個使用 net.JoinHostPort 的修復。

其他分析器更改

  • unusedvariable 快速修復現在預設開啟。
  • unusedparams 分析器不再報告生成檔案的發現。

新的 gofix 分析器

Gopls 現在會報告函式呼叫或常量使用何時應該被內聯。這些診斷和相關的程式碼操作由函式和常量定義處的“//go:fix inline”指令觸發。(請參閱 go:fix 提案。)

例如,考慮一個名為 intmath 的包,其中有一個函式 Square(int) int。後來引入了更通用的 Pow(int, int) int,並將 Square 棄用,改為呼叫第二個引數為 2 的 Powintmath 的作者可以寫成這樣

//go:fix inline
func Square(x int) int { return Pow(x, 2) }

如果 gopls 在你的程式碼中看到對 intmath.Square 的呼叫,它會建議內聯它,並提供一個程式碼操作來完成。

同樣的功能也適用於常量。對於像這樣的常量定義

//go:fix inline
const Ptr = Pointer

gopls 會建議在你的程式碼中將 Ptr 替換為 Pointer

使用此命令大規模應用此類修復

$ go run golang.org/x/tools/gopls/internal/analysis/gofix/cmd/gofix@latest -test -fix ./...

“實現”支援泛型

終於,“Go to Implementations”功能現在完全支援泛型型別和函式(#59224)。

例如,在下面的介面方法 Stack.Push 上呼叫此功能會報告具體的型別為 C[T].Push 的方法,反之亦然。

package p

type Stack[T any] interface {
    Push(T) error
    Pop() (T, bool)
}

type C[T any] struct{}

func (C[T]) Push(t T) error { ... }
func (C[T]) Pop() (T, bool) { ... }

var _ Stack[int] = C[int]{}

提取所選內容下的所有相同表示式例項

當你在一個函式中有多個相同的表示式例項時,你可以使用此程式碼操作將其提取到一個變數中。表示式的所有例項都將被替換為對新變數的引用。

“Definition”改進

Definition 查詢現在支援附加位置

  • 當在 return 語句上呼叫時,它會報告函式結果變數的位置。
  • 當在 break、goto 或 continue 語句上呼叫時,它分別報告標籤的位置、相關塊語句的結束大括號,或相關迴圈的開始位置。

“Hover”改進

當在 return 語句上呼叫時,hover 會報告函式結果變數的型別。

格式字串的使用者體驗改進

“DocumentHighlight”

當你的游標位於 printf 類函式內時,gopls 現在會突出顯示格式化動詞和引數之間的關係,作為視覺提示,以區分格式字串中運算元的使用方式。

fmt.Printf("Hello %s, you scored %d", name, score)

如果游標位於 %sname 上,gopls 會將 %s 突出顯示為寫操作,將 name 突出顯示為讀操作。

“SemanticHighlight”

與 DocumentHighlight 的改進類似,gopls 還將格式化動詞報告為“string” token 型別的“format”修飾符,以便更好地將其與其他格式字串部分割槽分開來。

fmt.Printf("Hello %s, you scored %d", name, score)

%s%d 將具有 token 型別“string”和修飾符“format”。


本文件的原始碼可以在 golang.org/x/tools/gopls/doc 下找到。