errname

Table of Contents

  1. 解決する問題
  2. 設定
  3. オプション
  4. サンプル
    1. 検出例
    2. 修正例
  5. 注意点
  6. 参考リンク

errname はセンチネルエラーに Err プレフィックス、エラー型に Error サフィックスが付いているかをチェックするツールです。

解決する問題

Go の慣例では、センチネルエラー(パッケージレベルのエラー変数)は Err で始め、エラー型(error インターフェースを実装する構造体)は Error で終わる命名にします。この規則に従わないと、コードを読む人がエラー関連の識別子を見落としやすくなります。

1
2
3
4
5
6
7
8
// Before: 命名規則に違反
var InvalidURLErr = errors.New("invalid url")
var Timeout = errors.New("timeout")

type DecodeErr struct {
Line int
}
func (e *DecodeErr) Error() string { return fmt.Sprintf("decode error at line %d", e.Line) }
1
2
3
4
5
6
7
8
// After: Go の命名規則に準拠
var ErrInvalidURL = errors.New("invalid url")
var ErrTimeout = errors.New("timeout")

type DecodeError struct {
Line int
}
func (e *DecodeError) Error() string { return fmt.Sprintf("decode error at line %d", e.Line) }

設定

公式ドキュメント

設定オプションはありません。有効化するだけで動作します。

1
2
3
4
5
6
# .golangci.yml
version: "2"

linters:
enable:
- errname

オプション

golangci-lint 経由では設定オプションはありません。

サンプル

検出例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// errname が警告するパターン

// 1. センチネルエラーに Err プレフィックスがない
var NotFoundError = errors.New("not found") // the sentinel error name `NotFoundError` should conform to the `ErrXxx` format
var InvalidInput = errors.New("invalid input") // the sentinel error name `InvalidInput` should conform to the `ErrXxx` format
var TimeoutErr = errors.New("timeout") // the sentinel error name `TimeoutErr` should conform to the `ErrXxx` format

// 2. エラー型に Error サフィックスがない
type ValidationErr struct {
Field string
Message string
}
func (e *ValidationErr) Error() string { return e.Message }
// the error type name `ValidationErr` should conform to the `XxxError` format

修正例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 1. Err プレフィックスを付ける
var ErrNotFound = errors.New("not found")
var ErrInvalidInput = errors.New("invalid input")
var ErrTimeout = errors.New("timeout")

// 2. Error サフィックスを付ける
type ValidationError struct {
Field string
Message string
}
func (e *ValidationError) Error() string { return e.Message }

// スライス型のエラーには Errors サフィックスも可
type ValidationErrors []ValidationError
func (e ValidationErrors) Error() string { /* ... */ }

注意点

  • パッケージレベルの変数・定数のみがチェック対象。関数内のローカル変数はチェックされない
  • EOF のようなイニシャリズム(全大文字の略語)は除外される
  • スライス・配列型のエラーには Errors(複数形)サフィックスも許可される
  • Go 標準ライブラリの慣例(io.EOFsql.ErrNoRowsjson.SyntaxError など)に準拠した命名を強制する

参考リンク