皆さんはgoのコードを書いていてimport周りや依存の整理に苦戦したことはありませんか?
そんなときはgoimportsが役に立ちます!
1. まず、goimports とはなにか
⚪︎gofmt + import 管理 ができる
→フォーマットに加え、未使用importを削除・不足を追加 などを自動でやってくれる!
⚪︎1コマンドで全て解決 できる
→goimports -w .
で前 .go
ファイルに対して上書き整形してくれる!
さらに、 golangci-lint
と併用すると フォーマット/静的解析/複雑度 を一気に管理できる(こちらは別で解説するかも)
→つまり、goの全ファイルのimport周りの整理を自動でしてくれるのがgoimiports!
2. 公式ルール:3 グループ & アルファベット順
こんな感じに整えてくれます!
import (
// ① 標準ライブラリ
"context"
"fmt"
// ② サードパーティ
"github.com/gin-gonic/gin"
// ③ モジュール内(自作)
"word_app/backend/src/utils/contextutil"
)
→ルールとしてはこんな感じ
- グループ間を 1 行空ける
- 各グループ内は ASCII 昇順
-
goimports
が自動で並べ替えてくれる
3. 使い分け
確認のみする(diff -u` | CI をつけると差分チェック)
goimports ./...
自動で修正して上書き保存までする
goimports -w ./...
特定のファイルのみ確認する場合
goimports < file.go
4. VS Code 内で動かす
-
go.toolsEnvVars
にGOFLAGS: -tags=tools
(必要なら) - Format On Save を有効
-
gopls
がgoimports
を内部呼び出し → 保存するだけで自動で整形完了
5. CI (github actions)で使ってみる
- name: Check goimports
run: |
set -e
diff=$(go run golang.org/x/tools/cmd/goimports@latest -d ./...)
if [ -n "$diff" ]; then
echo "$diff"
echo "::error ::goimports violations found"
exit 1
fi
-
-d
は差分をパッチ形式で出力し、ファイルは変更しない -
golangci-lint を使う場合は
linters: enable: [goimports, gofmt]
6. 出てくるエラーメッセージについて
・File is not properly formatted
→インポート順・グループ違反、空行不足 が原因
→goimports -w ./file.go
で修正
・goimports: cannot find module
→go.mod
にない
→go get <pkg>
で追加
・build constraints exclude all Go files
→タグが合わず除外
→goimports -tags prod
などで解決