[Day 15] Oops!Golang - Linter

https://ithelp.ithome.com.tw/upload/images/20200922/20115289ChmKGMYIVA.png

golangci-lint

是個針對Go語言多個Linters組合而成的Linter,是Linters的大集合。 導入linter在CI流程內,已成為常態,至少會警示你的code可能會遭遇哪些問題,安全性是否有疑慮等問題。

著名使用者們

以下著名的公司也有使用golangci-lint

在github查詢也有上萬個收尋結果唷!

設定

golangci-lint會從當前目錄的以下路徑中查找配置文件:

請自行在專案內建立上述其中一個檔案 ex:.golangci.yml檔案 這裡有個官網的.golangci.example.yml 範例給各位參考

使用

本機安裝

macOS

brew install golangci/tap/golangci-lint
brew upgrade golangci/tap/golangci-lint

Docker -> 個人推薦

docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:v1.30.0-alpine \
sh -c "golangci-lint run" -v

Linux and Windows

# binary will be $(go env GOPATH)/bin/golangci-lint
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.30.0
golangci-lint --version

CI/CD

example for drone:

kind: pipeline
type: docker
name: default

steps:
  - name: golangci-lint
    image: golangci/golangci-lint:v1.31.0-alpine
    commands:
      - golangci-lint run

Oops 誤報錯誤

當你的code確認沒問題,但Linter掃錯有bug想排除怎麼辦? golangci-lint有提供 可以排除不使用lint的code方法

排除全部linters

var bad_name int //nolint

排除特定linters

var bad_name int //nolint:golint,unused

程式碼區塊排除

請在上方排除 ex: func上方 and 宣告變數上方

//nolint
func allIssuesInThisFunctionAreExcluded() *string {
  // ...
}
//nolint:govet
var (
  a int
  b int
)

整個檔案排除特定linter

//nolint:unparam
package pkg

個人推薦使用此方法

排除特定linter,並在後方說明原因,往後review時才會快速掌握排除主因

//nolint:gocyclo // This legacy function is complex but the team too busy to simplify it
func someLegacyFunction() *string {
  // ...
}