Go で「declared and not used」エラーが解決できない
Go は宣言したローカル変数を一度も使わないとコンパイルエラーになる。
使わない変数は削除するか、ブランク識別子 _ に代入して明示的に破棄する。
import も同じ規則で未使用は許されない。
公開: 更新:
要約
Go では、関数内で宣言したローカル変数を一度も使わないと declared and not used でコンパイルが止まります。
これは警告ではなくエラーで、ビルド自体が通りません。
使わない変数は削除するのが基本で、どうしても残したいときはブランク識別子 _ に代入して「意図的に捨てている」ことをコンパイラに伝えます。
./main.go:6:2: declared and not used: x実行例
golang:1.23 のコンテナで、未使用の import と未使用のローカル変数を両方含むコードをビルドすると、"os" imported and not used と declared and not used: x が別々の行として同時に報告され、どちらもコンパイルを止める。
import を削り、変数をブランク識別子へ代入し直すと、同じ go build ./... が終了コード 0 で通る。
$ go build ./...
# example.com/unused
./main.go:5:2: "os" imported and not used
./main.go:9:2: declared and not used: x
終了コード: 1$ go build ./...
終了コード: 0$ go run .
hello$ go run .
123— 2026-08-28 時点の出力
検証環境
- 検証日
- 実行環境
golang:1.23Debian GNU/Linux 12 (bookworm)- バージョン
- Python 3.11.2
- Git 2.39.5
この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。
よくある原因
- 消し忘れ: デバッグ中に作った変数や、途中まで書いて使わなくなった変数が残っている。
:=で作って読み出していない:x := compute()のように代入はしたが、その後xを参照していない。
代入だけでは「使った」ことにならない点に注意。- 複数戻り値の受け取り:
v, err := f()のvを使わずに放置している。 - 未使用 import: 変数と同じ規則で、import したパッケージを使っていないと
imported and not usedになる。
ローカル変数に限った規則で、パッケージレベルの変数は未使用でもエラーになりません。
解決策
1. 使わない変数は削除する
最も素直な対処です。
エディタの Go 拡張(gopls)が未使用変数をハイライトしてくれるので、それを消します。
2. ブランク識別子 _ に代入する
戻り値の一部だけ必要なときは、不要な値を _ で受けます。
v, _ := strconv.Atoi(s) // err は使わないので _ で破棄
fmt.Println(v)一時的に変数を残したい(あとで使う予定)場合も、明示的に捨てられます。
x := compute()
_ = x // いまは使わないが意図的に保持ただし _ = x を多用するのは設計の臭いなので、本当に必要か見直すきっかけにします。
3. 未使用 import は自動整形で消す
未使用の import は手で消してもよいですが、goimports を使うと未使用の削除と不足の追加をまとめて行えます。
go install golang.org/x/tools/cmd/goimports@latest
goimports -w .VS Code の Go 拡張なら保存時に自動実行されるよう設定できます。
これらの実装制限は Go 言語仕様(新しいタブで開く) の宣言に関する節に「コンパイラは未使用のローカル変数の宣言を不正にしてよい」と明記されています。