decorder

Table of Contents

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

decorder はファイル内の宣言(typeconstvarfunc)の順序と数をチェックするツールです。

解決する問題

Go ファイル内の宣言の配置順序がバラバラだと、コードの見通しが悪くなります。型定義が関数の間に散在したり、定数と変数が混在したりすると、ファイルの構造を把握するのに時間がかかります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Before: 宣言の順序がバラバラ
package user

func NewUser(name string) *User { /* ... */ }

type User struct {
Name string
Age int
}

var defaultAge = 20

const maxNameLen = 100

type Role int

const (
_ Role = iota
RoleAdmin
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// After: type → const → var → func の順序で整理
package user

type User struct {
Name string
Age int
}

type Role int

const maxNameLen = 100

const (
_ Role = iota
RoleAdmin
)

var defaultAge = 20

func NewUser(name string) *User { /* ... */ }

設定

公式ドキュメント

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# .golangci.yml 設定例
version: "2"

linters:
enable:
- decorder
settings:
decorder:
dec-order:
- type
- const
- var
- func
disable-dec-order-check: false
disable-dec-num-check: false
disable-init-func-first-check: false

オプション

オプション デフォルト 説明
dec-order []string [type, const, var, func] 宣言の必須順序
disable-dec-order-check bool true 宣言順序のチェックを無効化する
disable-dec-num-check bool true 同種の宣言ブロックの重複チェックを無効化する
disable-init-func-first-check bool true init 関数が他の関数より前にあるかのチェックを無効化する
disable-type-dec-num-check bool false type 宣言の重複チェックを無視する
disable-const-dec-num-check bool false const 宣言の重複チェックを無視する
disable-var-dec-num-check bool false var 宣言の重複チェックを無視する
ignore-underscore-vars bool false アンダースコア変数(_)をチェックから除外する

サンプル

検出例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// decorder が警告するパターン

// 1. 順序違反: func が type より前にある
package example

func Helper() {} // decorder: "func" must not be placed before "type"

type Config struct {
Host string
}

// 2. 宣言ブロックの重複(disable-dec-num-check: false の場合)
const maxRetry = 3

const timeout = 30 // decorder: multiple "const" declarations are not allowed

// 3. init が他の関数の後にある(disable-init-func-first-check: false の場合)
func Run() {}

func init() {} // decorder: "init" func must be the first function in the file

修正例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package example

type Config struct {
Host string
}

const (
maxRetry = 3
timeout = 30
)

func init() {}

func Helper() {}

func Run() {}

注意点

  • デフォルトではすべてのチェックが無効(true)になっている。有効にするには disable-*-check: false を明示的に設定する
  • dec-order はカスタマイズ可能。チームの規約に合わせて [const, type, var, func] のような順序も指定できる
  • init 関数は Go の仕様上特別な関数のため、disable-init-func-first-check: false で他の func より前に配置することを強制できる
  • 同種の宣言を 1 つのブロックにまとめることを推奨するチェック(dec-num-check)は、関連する定数や変数をグループ化する習慣づけに有効

参考リンク