gocheckcompilerdirectives

Table of Contents

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

gocheckcompilerdirectives は Go のコンパイラディレクティブ(//go: コメント)が正しい形式かをチェックするツールです。

解決する問題

Go のコンパイラディレクティブ(//go:embed//go:generate//go:build など)は //go: の形式で記述する必要があります。//go: の間にスペースが入ると通常のコメントとして扱われ、コンパイラに無視されます。この誤りはコンパイルエラーにならないため、気づかないまま意図した動作をしなくなります。

1
2
3
4
5
6
7
8
// Before: スペースが入っているためコンパイラに無視される
package main

// go:embed config.json
var configData string

// go:generate stringer -type=Status
type Status int
1
2
3
4
5
6
7
8
// After: 正しい形式のコンパイラディレクティブ
package main

//go:embed config.json
var configData string

//go:generate stringer -type=Status
type Status int

設定

公式ドキュメント

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

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

linters:
enable:
- gocheckcompilerdirectives

オプション

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

サンプル

検出例

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

// 1. スペースが入っているディレクティブ
// go:embed schema.sql
var schemaSQL string

// 2. スペルミスのあるディレクティブ
//go:embod template.html
var templateHTML string

// 3. go:generate のスペースミス
// go:generate mockgen -source=repo.go -destination=mock_repo.go
type Repository interface {
FindByID(ctx context.Context, id string) (*User, error)
}

// 4. go:build のスペースミス
// go:build integration

package integration_test

修正例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//go:embed schema.sql
var schemaSQL string

//go:embed template.html
var templateHTML string

//go:generate mockgen -source=repo.go -destination=mock_repo.go
type Repository interface {
FindByID(ctx context.Context, id string) (*User, error)
}

//go:build integration

package integration_test

注意点

  • コンパイラディレクティブの誤りはコンパイルエラーにならないため、手動で発見するのが困難。この Linter で自動検出するのが効果的
  • //go:embed//go:generate//go:build//go:noinline//go:linkname など、すべてのコンパイラディレクティブが対象
  • ディレクティブ名のスペルミス(//go:embod など)も検出される
  • IDE のフォーマッターが //go: の後にスペースを挿入してしまうケースがあるため、CI での自動チェックが有効

参考リンク