在 VS code 設定 go linter

在 VS code 撰寫 go 程式的過程中,要檢查是否符合 coding style,以及提醒哪些變數或參數有定義卻沒使用,設定好 go linter 就沒有煩惱。

1. 環境 Environment

  • macOS 12.6.2
  • Visual Studio Code v1.74.3
  • go v1.19

2. 開始設定 Configuration

2.1. 安裝 Extension

在 VS code 安裝 Extension: Go

extension go

2.2. 安裝 Go tools

按下 cmd + shift + p 開啟 Command Palette,並且輸入 go install 後選取 Go: Install/Update Tools
go install

選取 staticcheckgopls 後,按下 OK 即開始安裝。
install tools

2.3. 設定參數

注意:完成下列的設定,一定要關閉 VS code 再重新開啟,才不會有怪怪的問題出現。

按下 cmd + shift + p 開啟 Command Palette,並且輸入 user 後選取 Preferences: Open User Settings (JSON)
open user settings

先在 settings.json 檔案內貼上基本設定,

1
2
3
4
5
6
7
8
"[go]": {
// "editor.snippetSuggestions": "none",
"editor.formatOnSave": true,
// "editor.codeActionsOnSave": {
// "source.organizeImports": true,
// "source.sortMembers": true
// }
},

"editor.snippetSuggestions": "none", 這樣就不會出現提示了。 –可是我需要–

接著貼上關於 gopls formatting 的設定,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// "go.lintFlags": ["-checks", "all"],
"gopls": {
"analyses": {
"ST1003": true,
"ST1016": true,
"ST1020": true,
"ST1021": true,
"ST1022": true,
"U1000": true,
},
"formatting.gofumpt": true,
"staticcheck": true,
"ui.completion.usePlaceholders": true,
// "ui.diagnostic.analyses": {
// "unusedparams": true
// },
"ui.semanticTokens": true,
"completionDocumentation": true
},
"go.useLanguageServer": false,

"go.useLanguageServer": false, 一定要設定成 false 才會有動作,這有點奇怪。

只要開啟 .go 檔案,就會連相同 package 的檔案一同檢查,可以看到 warning 如下圖,
check results

如果不想這麼自動的檢查,可以在 settings.json 將關於 gopls formatting 的設定改成以下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"go.lintFlags": ["-checks", "all"],
"gopls": {
// "analyses": {
// "ST1003": true,
// "ST1016": true,
// "ST1020": true,
// "ST1021": true,
// "ST1022": true,
// "U1000": true
// },
"formatting.gofumpt": true,
// "staticcheck": true,
"ui.completion.usePlaceholders": true,
"ui.diagnostic.analyses": {
"unusedparams": true
},
"ui.semanticTokens": true,
"completionDocumentation": true
},
// "go.useLanguageServer": false,

此時要檢查 User SettingsGo: Lint ToolGo: Lint Flags 是否設定正確。
lint tool - staticcheck

按下 cmd + shift + p 開啟 Command Palette,並且輸入 lint 後選取 Go: Lint Current Package (也可以選擇 Go: Lint Workspace)就可以看檢查的結果了
lint tool - staticcheck

補充說明:
在設定裡 "formatting.gofumpt": true, 這行若設定為 true 時,會在存檔時執行 “Group imports” 及精簡程式碼。 以下是未執行 format,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import (
"errors"
"fmt"
"haicds/internal/app/application/ebof"
"haicds/pkg/res"
"strconv"

"github.com/tidwall/gjson"
)

func foo() {
var webClientLogger = logger.WebClientAccessLog{
Type: accesslog.LogTypeValueList.EbofAction,
Description: "FW upgrade by disk ID",
}
webClientLogger.Code = res.SuccessCode
var cnt = make(map[string]interface{})

var qParams struct {
ID string `uri:"id" binding:"required"`
}
...
}

按下 cmd + s 存檔時,會自動進行 format,結果如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import (
"errors"
"fmt"
"strconv"

"haicds/internal/app/application/ebof"
"haicds/pkg/res"

"github.com/tidwall/gjson"
)

func foo() {
webClientLogger := logger.WebClientAccessLog{
Type: accesslog.LogTypeValueList.EbofAction,
Description: "FW upgrade by disk ID",
}
webClientLogger.Code = res.SuccessCode
cnt := make(map[string]interface{})

var qParams struct {
ID string `uri:"id" binding:"required"`
}
...
}

3. 後記

真心推薦 Goland,不要做任何設定 ( ^.< )

4. 參考資料 References