この記事は Zenn でも公開されています。
https://zenn.dev/sanpo_shiho/articles/09d1da9af91998
Go が公式で出していた Golint が deprecated/frozen しました。 https://github.com/golang/go/issues/38968
-
メンテがされていない
- 2018 年から実質的な変更が加わってない
- Issue も放置されているものが多い
-
golang org に存在する linter なので Go が公式として推奨している linter に見える
- Go が実際には保守されていないプログラムを公式として推奨しているように見えてしまう
-
開発者は合理的に異なるスタイルを採用したい場合がある
- Golint 単体で特定の警告を無視したりするなどの機能を持っていない
ということから attractive nuisance(魅力的な迷惑者)になっているという Proposal でした。Issue の議論を見ても deprecate/frozen することに対して否定的な意見は少なく、一年ほど前に approve されました。(なので「非推奨にしよう」なったの自体は少し前の話です)
そして golang/lint リポジトリが数日前にアーカイブされました。
https://github.com/golang/lint
代替としてどのツールを使用するか
代替と言っても Golint は(今となっては)数ある linter の一つと言った感じでした。単体で使っていた人は少ないかもしれません。
staticcheck
staticcheck は Proposal の Issue でも度々名前が上がっていた linter です。Google や Go がスポンサーになっており、Golint のリポジトリにも代替として名前が上がっています。
NOTE: Golint is deprecated and frozen. There’s no drop-in replacement for it, but tools such as Staticcheck and go vet should be used instead.
https://github.com/golang/lint
以下のように多くの check 項目に沿って静的解析が行われます。
https://staticcheck.io/docs/checks
また、特定の check 項目を無効にするなどの設定を行うこともでき、ソースコード中に//lint:ignore Check1[,Check2,...,CheckN] reason
とコメントすることで、報告をコードの一部で無効にすることもできます。
https://staticcheck.io/docs/configuration
go vet
こちらは Go に標準でのっているコマンドです。こちらもいくつかの check を搭載しています。
$ go tool vet help
vet is a tool for static analysis of Go programs.
vet examines Go source code and reports suspicious constructs,
such as Printf calls whose arguments do not align with the format
string. It uses heuristics that do not guarantee all reports are
genuine problems, but it can find errors not caught by the compilers.
Registered analyzers:
asmdecl report mismatches between assembly files and Go declarations
assign check for useless assignments
atomic check for common mistakes using the sync/atomic package
bools check for common mistakes involving boolean operators
buildtag check that +build tags are well-formed and correctly located
cgocall detect some violations of the cgo pointer passing rules
composites check for unkeyed composite literals
copylocks check for locks erroneously passed by value
errorsas report passing non-pointer or non-error values to errors.As
framepointer report assembly that clobbers the frame pointer before saving it
httpresponse check for mistakes using HTTP responses
ifaceassert detect impossible interface-to-interface type assertions
loopclosure check references to loop variables from within nested functions
lostcancel check cancel func returned by context.WithCancel is called
nilfunc check for useless comparisons between functions and nil
printf check consistency of Printf format strings and arguments
shift check for shifts that equal or exceed the width of the integer
stdmethods check signature of methods of well-known interfaces
stringintconv check for string(int) conversions
structtag check that struct field tags conform to reflect.StructTag.Get
testinggoroutine report calls to (*testing.T).Fatal from goroutines started by a test.
tests check for common mistaken usages of tests and examples
unmarshal report passing non-pointer or non-interface values to unmarshal
unreachable check for unreachable code
unsafeptr check for invalid conversions of uintptr to unsafe.Pointer
unusedresult check for unused results of calls to some functions
また、golang.org/x/tools/go/analysis を使用しているサードパーティの linter をgo vet
で実行することも可能です。
https://pkg.go.dev/golang.org/x/tools/go/analysis
revive
golangci-lint で Golint の代替として挙げられている Linter です。
https://github.com/mgechev/revive
🔥 ~6x faster, stricter, configurable, extensible, and beautiful drop-in replacement for golint
このように銘打っている通り、Golint と似た内容のチェックを行います。
また、Golint の deprecate の Issue でも指摘が入っていた「有効にする check を選ぶことができる」という機能も持っていたりします。 (Golint との差分は Readme の「Here’s how revive is different from golint」を確認してください)
golangci-lint
golangci-lint は単なる linter の runner です。上記二つとは少し毛色が違いますね。 (go vet もサードパーティの linter を実行できるので runner という見方もできるかもですが)
多くの linter が直接搭載されており、個々の linter をインストールせずとも、golangci-lint をインストールし、設定を済ませれば多くの linter を同時に実行することができるメリットがあります。
https://golangci-lint.run/usage/configuration/
また、有効にする linter の設定などを含めかなり詳細な設定をすることが可能です。
staticcheck と同様にソースコード中に//nolint:lintername
とコメントすることで、報告をコードの一部で無効にすることもできます。
前述の staticcheck、go vet
に搭載されている check なども golangci-lint 上で実行することができるので「最強じゃん!」と見えますが、設定が煩雑になっていくことなどをデメリットに挙げる意見なども見かけます。
ちなみに、golangci-lint 上でも Golint を実行できたのですが、Golint のアーカイブが実際に行われたことを受け、つい先ほど golangci-lint 上でも deprecate されました。次のリリース以降 Golint を使用していると deprecated のエラーが出るようになるはずです。
https://github.com/golangci/golangci-lint/issues/1892 https://github.com/golangci/golangci-lint/pull/1965
終わりに
今までありがとう。R.I.P. Golint