Go で「declared and not used」エラーが解決できない
Go は宣言したローカル変数を一度も使わないとコンパイルエラーになる。
使わない変数は削除するか、ブランク識別子 `_` に代入して明示的に破棄する。
import も同じ規則で未使用は許されない。
#go#compile-error#unused-variable#declared-and-not-used
公開:
要約
Go では、関数内で宣言したローカル変数を一度も使わないと declared and not used でコンパイルが止まります。
これは警告ではなくエラーで、ビルド自体が通りません。
使わない変数は削除するのが基本で、どうしても残したいときはブランク識別子 _ に代入して「意図的に捨てている」ことをコンパイラに伝えます。
./main.go:6:2: declared and not used: xよくある原因
- 消し忘れ: デバッグ中に作った変数や、途中まで書いて使わなくなった変数が残っている。
:=で作って読み出していない: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 言語仕様 の宣言に関する節に「コンパイラは未使用のローカル変数の宣言を不正にしてよい」と明記されています。