revive は golint の後継となる高速で拡張可能な Go Linter です。
解決する問題
Go の標準的な Linter である golint は非推奨となり、設定の柔軟性やルールの拡張性に限界がありました。revive は golint 互換のルールに加え、100 以上のルールを備え、ルールごとの有効化・無効化・重大度設定が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
func ProcessData(data []byte) error { return nil }
var BadError = errors.New("bad")
func (s *Service) Health() string { return "ok" }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
func ProcessData(data []byte) error { return nil }
var ErrBad = errors.New("bad")
func (*Service) Health() string { return "ok" }
|
設定
公式ドキュメント
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| version: "2"
linters: enable: - revive settings: revive: severity: warning enable-default-rules: true rules: - name: exported severity: warning - name: error-naming severity: warning - name: var-naming severity: warning - name: unexported-return severity: warning - name: blank-imports severity: warning - name: context-as-argument severity: error - name: dot-imports severity: warning - name: error-return severity: warning - name: increment-decrement severity: warning - name: receiver-naming severity: warning
|
オプション
| オプション |
型 |
デフォルト |
説明 |
severity |
string |
warning |
デフォルトの重大度(warning / error) |
confidence |
float |
0.8 |
この信頼度未満の警告を無視する |
enable-all-rules |
bool |
false |
すべてのルールを有効化する |
enable-default-rules |
bool |
false |
明示的なルール指定時もデフォルトルールを維持する |
rules |
[]rule |
[] |
ルールごとの設定(名前、重大度、引数、除外パターン) |
directives |
[]directive |
[] |
コメントディレクティブの設定 |
主要なルール
命名規則
| ルール |
検出内容 |
exported |
公開シンボルにドキュメントコメントがない |
var-naming |
変数名が Go の命名規則に違反(mixedCaps でない等) |
error-naming |
エラー変数に Err プレフィックスがない |
receiver-naming |
レシーバ名が一貫していない、または長すぎる |
package-comments |
パッケージコメントがない |
コードスタイル
| ルール |
検出内容 |
blank-imports |
テスト以外でのブランクインポート |
context-as-argument |
context.Context が第一引数でない |
dot-imports |
ドットインポートの使用 |
error-return |
エラーが最後の戻り値でない |
increment-decrement |
x += 1 の代わりに x++ を使うべき |
unexported-return |
公開関数が非公開型を返している |
複雑度・品質
| ルール |
検出内容 |
cognitive-complexity |
認知的複雑度が高い関数 |
cyclomatic |
循環的複雑度が高い関数 |
function-length |
関数が長すぎる |
argument-limit |
引数が多すぎる |
confusing-naming |
紛らわしい命名 |
サンプル
検出例
1 2 3 4 5 6 7 8 9 10 11 12
| func FetchUser(id string, ctx context.Context) (*User, error) { return nil, nil }
import . "fmt"
func Parse(s string) (error, *Result) { return nil, nil }
|
修正例
1 2 3 4 5 6 7 8 9
| func FetchUser(ctx context.Context, id string) (*User, error) { return nil, nil }
import "fmt"
func Parse(s string) (*Result, error) { return nil, nil }
|
注意点
- revive のルール挙動は独特で、明示的にルールを 1 つでも指定するとデフォルトルールが無効になる。
enable-default-rules: true を併用するとデフォルトルールを維持できる
//revive:disable / //revive:enable ディレクティブで行やブロック単位で抑制できる
- golangci-lint 経由では revive のフォーマッター設定は無視される(出力形式は golangci-lint が統一する)
参考リンク