Gopls release v0.18.0
配置更改
-
hoverKind
選項的實驗性Structured
值不再受支援。 -
gc_details
程式碼提示已被刪除。(它之前預設是停用的。)現在可以透過toggleCompilerOptDetails
程式碼操作(下文有說明)來獲得此功能,因為程式碼操作在各種客戶端中的支援程度比程式碼提示更好。VS Code 的特殊命令“Go: Toggle GC details”仍然有效。
-
實驗性的
semanticTokenTypes
和semanticTokenModifiers
選項允許在textDocument/semanticTokens
響應中選擇性地停用某些型別的 token 或 token modifiers。這些選項取代了現在已棄用的
noSemanticString
和noSemanticTokenNumber
選項。使用者現在可以設定“semanticTokenTypes”: {“string”: false, “number”: false}
來達到相同的結果。目前,gopls 仍然支援noSemanticTokenString
和noSemanticToken
,但在未來的版本中將停止支援它們。 -
新的
workspaceFiles
選項允許配置匹配定義工作區邏輯構建檔案的 glob 模式。此選項僅在使用自定義 golang.org/x/tools/go/packages 驅動程式的環境中需要。
新功能
“{顯示,隱藏}編譯器最佳化詳細資訊” 程式碼操作
此程式碼操作可以透過 VS Code 中的“Source Action”選單訪問,它會切換一個每目錄的標誌,導致 Go 編譯器最佳化詳細資訊作為診斷報告。例如,它會指示哪些變數會逃逸到堆中,以及哪些陣列訪問需要邊界檢查。
TODO:為每個專案新增指向完整手冊的連結。
新的 modernize
分析器
Gopls 現在會報告程式碼何時可以透過使用更現代的 Go 功能來簡化或澄清,並提供一個快速修復來應用更改。
例如,使用 if/else 語句的條件賦值可以被 Go 1.18 中新增的 min
或 max
內建函式呼叫所取代。
使用此命令大規模應用現代化修復
$ 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 的 Pow
。intmath
的作者可以寫成這樣
//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)
如果游標位於 %s
或 name
上,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 下找到。