go-linting について
Go 開発者向けの静的解析スキルです。一貫したチェックの設定に向けて、golangci-lint の構成、推奨リンター、抑制ルール、CI での利用方法を案内します。
主な機能
- 01セットアップスクリプトと golangci-lint v2 の設定例
- 02エラー、スタイル、静的解析向けリンターの推奨
- 03設定検証と段階的な lint の指針
- 04理由を添えた名前付き nolint 指示
- 05CI とコミット前チェックの連携パターン
活用シーン
- 01Go リポジトリへの lint 導入
- 02エラー処理やバグ検出向けリンターの選定
- 03CI やコミット前の一貫した lint 実行
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ cxuu/ golang-skills --skill go-lintingインストール後、Claude Code で/go-lintingを入力して読み込まれたか確認します。
同梱ファイルassets/golangci.ymlscripts/setup-lint.sh
詳細
Go の Lint
基本原則
どの「推奨」リンターセットを使うかよりも重要なのは、コードベース全体で一貫して Lint を実行することです。
一貫した Lint により、よくある問題を検出し、不必要に細かく規定することなく、コード品質の高い基準を確立できます。
リソースの使い分け
scripts/setup-lint.sh-.golangci.ymlの生成、最初の Lint 実行結果の検証、または JSON メタデータの生成時に実行します。assets/golangci.yml- 既存プロジェクトで golangci-lint v2 のベースラインとして使用します。
セットアップ手順
scripts/setup-lint.shを使って.golangci.ymlを作成するか、assets/golangci.ymlをコピーしますgolangci-lint run ./...を実行します- エラーが発生した場合は、カテゴリごとに修正します(まずフォーマット、次に vet、その後スタイル)
- エラーがなくなるまで再実行します
.golangci.yml を生成したら、設定スキーマを検証してから Lint 結果を利用するために、
golangci-lint config verify --config .golangci.yml を実行します。
最低限推奨するリンター
次のリンターは、高い品質基準を維持しながら、よくある問題を検出します。
| リンター | 目的 |
|---|---|
| errcheck | エラーが処理されていることを確認します |
| goimports | コードをフォーマットし、インポートを管理します |
| revive | よくあるスタイル上のミスを検出します(golint の最新の代替) |
| govet | よくあるミスがないかコードを解析します |
| staticcheck | さまざまな静的解析チェックを行います |
注:
reviveは、現在は非推奨となっているgolintの最新かつ高速な後継です。
Lint ランナー:golangci-lint
Lint ランナーとして golangci-lint を使用します。uber-go/guide の設定例 .golangci.ymlを参照してください。
設定例
保守されている設定例として assets/golangci.yml を使用します。golangci-lint v2 を対象としており(2026-06-19 に 2.10.1 で検証済み)、goimports
を formatters の下に置き、コアリンターに加えて、本番環境でよく使われるリンターを有効にします。
実行方法
# Install the version this skill's config is verified against
go install github.com/golangci/golangci-lint/v2/cmd/[email protected]
# Run all linters
golangci-lint run
# Run on specific paths
golangci-lint run ./pkg/...
追加で推奨するリンター
最低限のセットに加え、本番プロジェクトでは次のリンターも検討してください。
| リンター | 目的 | 有効にするタイミング |
|---|---|---|
| gosec | セキュリティ脆弱性の検出 | ユーザー入力を扱うサービスでは常に |
| ineffassign | 効果のない代入の検出 | 常に — デッドコードを検出します |
| misspell | コメントや文字列中のよくあるスペルミスの修正 | 常に |
| gocyclo | 循環的複雑度のしきい値チェック | 関数の複雑度が約 15 を超える場合 |
| exhaustive | switch がすべての enum 値を網羅していることの確認 | iota enum を使用する場合 |
| bodyclose | HTTP レスポンスボディの閉じ忘れの検出 | HTTP クライアントコードでは常に |
Nolint ディレクティブ
Lint の指摘を抑制する場合は、必ず理由を説明してください。
//nolint:errcheck // fire-and-forget logging; error is not actionable
_ = logger.Sync()
ルール:
//nolint:linternameを使用します —//nolintのみの指定は使用しません- 指摘と同じ行にコメントを配置します
//の後に理由を記載します
CI/CD との統合
テストの後に、CI で golangci-lint run ./... を実行します。
ローカル環境とリリース時の動作に差異が生じないよう、CI で使用する golangci-lint のバージョンを固定します。
Pre-commit フック
#!/bin/sh
# .git/hooks/pre-commit
golangci-lint run --new-from-rev=HEAD~1
変更されたコードのみを Lint するには --new-from-rev を使用し、フィードバックループを高速に保ちます。
クイックリファレンス
| タスク | コマンド/操作 |
|---|---|
| golangci-lint のインストール | go install github.com/golangci/golangci-lint/v2/cmd/[email protected] |
| リンターの実行 | golangci-lint run |
| パスを指定して実行 | golangci-lint run ./pkg/... |
| 設定ファイル | プロジェクトルートの .golangci.yml |
| CI との統合 | パイプラインで golangci-lint run を実行 |
| Nolint ディレクティブ | //nolint:name // reason — //nolint のみの指定は禁止 |
| CI との統合 | GitHub Actions では golangci/golangci-lint-action を使用 |
| プリコミット | golangci-lint run --new-from-rev=HEAD~1 |
リンター選択の指針
| 必要なこと | 使用するもの |
|---|---|
| エラーハンドリングの網羅性 | errcheck |
| インポートのフォーマット | goimports |
| スタイルの一貫性 | revive |
| バグの検出 | govet, staticcheck |
| 上記すべて | 設定ファイルを使った golangci-lint |
関連スキル
- スタイルの基礎:リンターが適用するスタイル上の疑問(フォーマット、ネスト、命名)を解決する場合は、go-style-core を参照してください
- コードレビュー:リンターの出力と手動レビュー用チェックリストを組み合わせる場合は、go-code-review を参照してください
- エラーハンドリング:errcheck が未処理のエラーを報告し、その処理方法を判断する必要がある場合は、go-error-handling を参照してください
- テスト:CI パイプラインでテストと併せてリンターを実行する場合は、go-testing を参照してください