Gopls release v0.19.0

配置更改

  • gopls check 子命令現在接受一個 -severity 標誌,用於設定它報告的診斷的最低嚴重級別。預設情況下,最低嚴重級別是“warning”,因此 gopls check 可能會報告比以前少的診斷。設定 -severity=hint 以重現以前的行為。

“實現”支援簽名型別(同一包內)

實現查詢根據方法集報告抽象型別和具體型別及其方法之間的對應關係。現在,它還根據簽名報告函式型別、動態函式呼叫和函式定義之間的對應關係。

要使用它,請在命名函式、命名方法或函式字面量的定義的 func 標記上呼叫實現查詢。Gopls 將報告抽象該函式的函式簽名型別集,以及透過此類型別的值進行的動態呼叫集。

反之,在簽名型別的 func 標記上,或在動態函式呼叫的 ( 括號上呼叫實現查詢,將報告該簽名所抽象的,或該呼叫分派到的具體函式集。

由於一個型別可能既是函式型別又是帶方法的命名型別(例如,http.HandlerFunc),因此它可能參與兩種型別的實現查詢(方法集和函式簽名)。使用方法集進行的查詢應在型別或方法名稱上呼叫,使用簽名進行的查詢應在 func( 標記上呼叫。

目前僅支援本地(同一包內)演算法。(https://golang.org.tw/issue/56572 跟蹤全域性演算法。)

“轉到實現”報告介面到介面的關係

“轉到實現”操作現在報告介面之間的關係。Gopls 現在使用查詢型別的具體性來確定查詢是“向下”(從介面到實現它的型別)還是“向上”(從具體型別到它可以分配到的介面)。例如:

  • implementation(io.Reader) 子介面,例如 io.ReadCloser,以及具體實現,例如 *os.File

  • implementation(os.File) 僅包含介面,例如 io.Readerio.ReadCloser

要從介面開始請求“向上”查詢,例如查詢 io.ReadCloser 的超介面,請使用下面描述的型別層級結構功能。(請參閱 https://github.com/microsoft/language-server-protocol/issues/2037。)

支援型別層級結構

Gopls 現在實現了與型別層級結構檢視器相關的三個 LSP 方法:textDocument/prepareTypeHierarchytypeHierarchy/supertypestypeHierarchy/subtypes

在 VS Code 中,從上下文選單中選擇“Show Type Hierarchy”(顯示型別層級結構)以檢視顯示所選命名型別的所有超型別或子型別的樹狀控制元件。

編輯功能

補全:為新 Go 檔案自動補全 package 子句

Gopls 現在會自動為新建立的 Go 檔案新增適當的 package 子句,以便您可以立即開始編寫有趣的部分。

它需要客戶端支援 workspace/didCreateFiles

新的 GOMODCACHE 索引,用於更快的 Organize Imports 和未匯入的補全

預設情況下,gopls 現在構建並維護模組快取(GOMODCACHE)中包的持久索引。Organize Imports 和來自未匯入包的符號補全的操作速度提高了十倍。

要恢復到舊行為,請將 importsSource 選項(新預設值為 "gopls")設定為 "goimports"。不希望將模組快取用於 imports 或 completions 的使用者可以將該選項更改為“off”。

分析功能

大多數 staticcheck 分析器預設啟用

Staticcheck 套件中的分析器數量略多於一半現在預設啟用。此子集已選擇用於精確性和效率。

以前,僅當啟用了實驗性的 staticcheck 布林選項時,才會執行 Staticcheck 分析器(全部)。此值繼續啟用完整集,而 false 值繼續停用完整集。將該選項留空會啟用首選的分析器子集。

Staticcheck 分析器與其他所有分析器一樣,可以使用 analyzers 配置設定顯式啟用或停用;此設定現在優先於 staticcheck 設定,因此,無論您使用 staticcheck 的哪個值(true/false/unset),您都可以根據首選的分析器集進行調整。

recursiveiter:“低效的遞迴迭代器”

編寫一個為遞迴資料型別返回迭代器(iter.Seq)的函式時,一個常見的陷阱是從其自身實現中遞迴呼叫該函式,這會導致巢狀協程的堆疊,效率低下。

新的 recursiveiter 分析器會檢測此類錯誤;有關詳細資訊,請參閱其文件,包括有關如何定義簡單高效的遞迴迭代器的提示。

maprange:“低效的 map.Keys/Values 範圍迴圈”

新的 maprange 分析器會檢測在 range 迴圈的運算元處對 maps.Keysmaps.Values 的冗餘呼叫;當然,map 可以直接進行 range 迴圈。有關詳細資訊,請參閱其文件)。

程式碼轉換功能

重新命名方法接收器

當重新命名操作應用於方法接收器的宣告時,現在也會嘗試重新命名與同一命名型別相關的所有其他方法的接收器。無法完全重新命名的其他接收器將被靜默跳過。

重新命名方法接收器的使用繼續僅影響該變數。

type Counter struct { x int }

                 Rename here to affect only this method
                          ↓
func (c *Counter) Inc() { c.x++ }
func (c *Counter) Dec() { c.x++ }
      ↑
  Rename here to affect all methods

“消除點匯入”程式碼操作

此程式碼操作可在點匯入上使用,它將提供用常規匯入替換該匯入,並使用包名限定每個使用。

為結構體欄位新增/刪除標籤

Gopls 現在提供兩個新的程式碼操作,可在整個結構體或其部分欄位上使用,允許您新增和刪除結構體標籤。它僅新增具有 snakecase 命名格式的“json”標籤,或清除所選範圍內的所有標籤。

新增標籤示例

type Info struct {
    LinkTarget string        ->      LinkTarget string `json:"link_target"`
    ...
}

內聯區域性變數

新的 refactor.inline.variable 程式碼操作會用變數的初始化表示式替換對區域性變數的引用。例如,當應用於 println(s) 中的 s 時:

func f(x int) {
    s := fmt.Sprintf("+%d", x)
    println(s)
}

它將程式碼轉換為:

func f(x int) {
    s := fmt.Sprintf("+%d", x)
    println(fmt.Sprintf("+%d", x))
}

僅替換一個引用;https://golang.org.tw/issue/70085 跟蹤“內聯所有”變數用法並消除它的功能。

感謝我們的貢獻者!

@acehinnnqru @adonovan @albfan @aarzilli @ashurbekovz @cuonglm @dmitshur @neild @egonelbre @shashank priyadarshi @firelizzard18 @gopherbot @h9jiang @cuishuang @jakebailey @jba @madelinekalil @karamaru alpha @danztran @nsrip dd @pjweinb @findleyr @samthanawalla @seankhliao @tklauser @vikblom @kwjw @xieyuschen


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