Skip to content

Instantly share code, notes, and snippets.

@taichi
Last active May 7, 2024 07:29
Show Gist options
  • Save taichi/8c214eeec8e66e0edc6f733a22180d8a to your computer and use it in GitHub Desktop.
Save taichi/8c214eeec8e66e0edc6f733a22180d8a to your computer and use it in GitHub Desktop.
ロギングライブラリのあり方については別途要検討。zapやzerologを使うならファクトリ関数だけを置くようにした方がいいかも。
linters-settings: # 設定のデフォルト値は、https://github.com/golangci/golangci-lint/blob/master/.golangci.example.yml で確認できる
depguard: # packagesに宣言されているモジュールの取り扱いに関するルール。ブラックリスト形式で使っているので、列挙したものを使うとエラーになる。
list-type: blacklist
packages:
- golang.org/x/xerrors # go 1.13で必要な機能はすべてerrorsに取り込まれたので使わない
- github.com/rs/zerolog # ログ出力用のライブラリはプロジェクト内部に作ったファクトリ関数経由で使うため
packages-with-error-message:
- golang.org/x/xerrors: "エラー処理は標準のerrorsを使って下さい。スタックトレースが必要な場合のみpkg/errorsを使って下さい"
- github.com/rs/zerolog: "ログ出力は example.com/myproject/logger#Newから利用して下さい"
dupl: # コードのコピペを検出するルール。 閾値のトークン数を越えるものをエラーにする
threshold: 100
funlen: # 閾値を越えて大きすぎる関数を検出するルール
lines: 100
statements: 50
goconst: # 繰り返し使われている文字列定数を検出するルール。宣言を集約すべき。
min-len: 2
min-occurrences: 2
gocritic: # 意見が強いルールが多数含まれるルールの集合
enabled-tags:
- diagnostic # 概ねバグと思われるコードの検出するルール
- experimental # 各検査グループの中で、特に実験的なルール
- performance # パフォーマンスに悪い影響があるコードを検出するルール
disabled-checks:
- commentedOutCode # 日本語で誤検知するので無効化
- commentFormatting # autofixできないので無効化
- ifElseChain # if/else if/elseをswitchで置き換えることを強制しない
- whyNoLint # nolintlint と重複しているため無効化
- yodaStyleExpr # goではif文の条件式に代入は定義できないので不要。比較演算の左辺値をどう書くかは仕様書と併せるべき。
goimports: # import 順を並び変える際に、local-prefixesを設定するとプロジェクトのモジュールが一番下になるよう調整してもらえる。
local-prefixes: example.com/myproject
gomnd: # マジックナンバーを検出するルール
settings:
mnd:
# https://github.com/tommy-muehle/go-mnd#checks
checks: argument,case,condition,return
govet: # go標準の検査
check-shadowing: true
misspell: # 典型的な英語のスペルミスを検出するルール
locale: US
nolintlint: # nolintディレクティブでlintチェックを無効化する際に付与するコメントの書き方のルール
allow-leading-space: true # don't require machine-readable nolint directives (i.e. with no leading space)
allow-unused: false # report any unused nolint directives
require-explanation: false # don't require an explanation for nolint directives
require-specific: false # don't require nolint directives to be specific about which linter is being skipped
linters:
disable-all: true # 適用するものを明示的に列挙するため、デフォルトのルールを全て無効化。
enable:
- bodyclose # https://github.com/timakin/bodyclose http.ResponseのCloseが呼び出されているかどうかを検査する。go vetのhttpresponseは、errチェックの後にCloseを呼んでいるかを検査する。
- depguard # https://github.com/OpenPeeDeeP/depguard
- dogsled # https://github.com/alexkohler/dogsled 空白識別子(_)を複数使っているものを検出するルール
- dupl # https://github.com/mibk/dupl コードのコピペを検出するルール
- errcheck # https://github.com/kisielk/errcheck 関数の戻り値としてErrorがある場合に、それに対する処理を実施していないものを検出するルール
- exhaustive # https://github.com/nishanths/exhaustive switch-caseをenumで分岐する際に全ての要素をcaseとして宣言していないものを検出するルール
- exportloopref # https://github.com/kyoh86/exportloopref forやrangeのループ変数が同じポインタを指すことに起因するバグを検出するルール。例:https://jovi0608.hatenablog.com/entry/2020/03/09/094737
- funlen # https://github.com/ultraware/funlen
- gochecknoinits # https://github.com/leighmcculloch/gochecknoinits init関数の定義を検出するルール。副作用のあるimport文は処理順によって動作が著しく変化したり、テスト可能性が低減するため望ましくない。
- goconst # https://github.com/jgautheron/goconst
- gocognit # https://github.com/uudashr/gocognit 人間の認知的負荷が高いコードをエラーにする。 https://www.sonarsource.com/resources/white-papers/cognitive-complexity.html
- gocritic # https://github.com/go-critic/go-critic
- goerr113 # https://github.com/Djarvur/go-err113 go 1.13以前のスタイルで記述されたエラー処理を検出するルール。 cf. https://blog.golang.org/go1.13-errors
- goimports # https://godoc.org/golang.org/x/tools/cmd/goimports go標準のimport文を並べ替える処理。未使用のimport文は削除してしまう。VS Codeではgoreturnsを使うことでimport文の自動補完を行うこと。尚、goreturnsは内部でgoimportsを使ってるため、結果に差分が発生することはない。
- gomnd # https://github.com/tommy-muehle/go-mnd
- gosec # https://github.com/securego/gosec 脆弱性になりうるコードを検出するルール
- gosimple # https://github.com/dominikh/go-tools/tree/master/simple より単純な表記法のあるコードを検出するルール
- govet # go標準のlintツール 処理内容の確認は、https://github.com/golang/go/blob/master/src/cmd/vet/main.go
- ineffassign # https://github.com/gordonklaus/ineffassign 無効な代入を検出するルール
- misspell # https://github.com/client9/misspell
- nakedret # https://github.com/alexkohler/nakedret 大きな関数(デフォルト値は30行)において Named Result Parameters を使っている場合エラーにするルール。https://github.com/golang/go/wiki/CodeReviewComments#named-result-parameters
- noctx # https://github.com/sonatard/noctx net/httpのモジュールを使う際にContextを渡していないものを検出するルール
- nolintlint # https://github.com/golangci/golangci-lint/tree/master/pkg/golinters/nolintlint
- rowserrcheck # https://github.com/jingyugao/rowserrcheck database/sql.Rows の rows.Err()をエラーチェックしているか検査するルール
- staticcheck # https://staticcheck.io/ デファクトスタンダードな静的検査ツール
- structcheck # https://gitlab.com/opennota/check 未使用の構造体メンバを検出するルール
- stylecheck # https://github.com/dominikh/go-tools/tree/master/stylecheck golintの再実装版。コード内にしかドキュメントが無い。
- typecheck # goコンパイラと同等の型チェックを実施するルール
- unconvert # https://github.com/mdempsky/unconvert 不必要な型チェックを検出するルール
- unparam # https://github.com/mvdan/unparam 関数の引数のうち使われていないものを検出するルール
- unused # https://github.com/dominikh/go-tools/tree/master/unused 使われていない定数、変数、関数、型を検出するルール
# - asciicheck # https://github.com/tdakkota/asciicheck 識別子として非アスキー文字が使われているか検査するルール
# - deadcode # https://github.com/remyoudompheng/go-misc/tree/master/deadcode 全くメンテナンスされていない。unused と go vet の unreachable を併せると似たような検査が行えるため無効化。
# - forbidigo # https://github.com/ashanbrown/forbidigo go vet の printf と同じ検査内容であるため無効化。
# - gochecknoglobals # グローバル変数を検出し一部の例外を除きエラーとするルール
# - gocyclo # https://github.com/alecthomas/gocyclo サイクロマティック複雑度を計測して閾値を超えるコードを検出するルール。テストの難しさよりも可読性を担保したいのでgocognitを使う。
# - godot # https://github.com/tetafro/godot コメントの末尾がドット(.)で終わっているか検査するルール
# - godox # https://github.com/matoous/godox TODOやFIXMEを検出するルール。Lintエラーとすべきかは要検討
# - gofmt # go標準のフォーマッタ goimportsの中に処理が含まれているため無効化
# - gofumpt # https://github.com/mvdan/gofumpt フォーマッタとしてはgoimportsを使うので不要
# - goheader # https://github.com/denis-tingajkin/go-header ソースコードのファイルヘッダが一定の様式を満たしているか検査するルール。
# - golint # https://github.com/golang/go/issues/38968 メンテが終了しており、staticcheckで同様のことが実行可能なため無効化
# - interfacer # https://github.com/mvdan/interfacer メンテが終了しており、特に便利でもないので無効化
# - lll # https://github.com/walle/lll 一行あたりの文字数を制限するするルール。文字数が大きすぎるコードやコメントは、エディタの折り返し機能を使って読む。VA CodeならToggle Word Wrap (Alt + Z) を使う。
# - maligned # 構造体が最適なレイアウトになっているかチェックするルール。パフォーマンスチューニングで必要なら https://github.com/dominikh/go-tools のstructlayout-optimizeを使うこと。
# - nestif # https://github.com/nakabonne/nestif gocognitと同じ目的で作られており差分が無さそう。どういうモチベーションで再実装したのか読み取れないため、保留。
# - prealloc # https://github.com/alexkohler/prealloc sliceを宣言する際に初期値が無いものを検出するルール。ループ内でsliceを確保するようなコードが頻出するようなら有効化すること。
# - scopelint # https://github.com/kyoh86/scopelint メンテ終了済。exportloopref で同じ検査ができる。
# - testpackage # https://github.com/maratori/testpackage テストコードがディレクトリごと分離していることを検査するルール
# - varcheck # https://gitlab.com/opennota/check unusedと検査内容が重複しているので無効化
# - whitespace # https://github.com/ultraware/whitespace gofmt で同じことができるため無効化
# - wsl # https://github.com/bombsimon/wsl gofmt で同じことができるため無効化
issues:
exclude-rules:
- path: _test\.go
linters:
- gomnd
run:
skip-dirs:
- test/testdata_etc
skip-files:
- ".*\\.generated\\.go$" # ツールによる生成物は検査の対象にしない
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment