declared and not used: の原因と直し方
Goでは変数を宣言しても一度も使わないとコンパイルエラーになります。デバッグ用に一時的に変数を減らした際など、使い忘れの変数が残っていると発生します。
エラーメッセージの読み方
./main.go:6:5: declared and not used: count
./main.go- ファイル名
6- 行番号
5- 列番号
declared and not used: count- 詳細メッセージ — 何が問題だったか
このエラーが出る典型パターン
パターン1
1 package main 2 3 import "fmt" 4 5 func main() { 6 count := 5 7 ^ 8 fmt.Println("done") 9 }
countを宣言しても一度も使っていません。使わない変数は_に代入するか、削除する必要があります。
直し方: (空) を _ = count にします。
パターン2
1 package main 2 3 import "fmt" 4 5 func main() { 6 total := 100 7 ^ 8 fmt.Println("done") 9 }
未使用の変数はGoコンパイラがエラーとして検出します。_に代入すれば意図的に捨てたことを表現できます。
直し方: (空) を _ = total にします。
パターン3
1 package main 2 3 import "fmt" 4 5 func main() { 6 name := "go" 7 score := 10 8 ^ 9 fmt.Println(name) 10 }
nameは使われていますがscoreは使われていません。使う変数と使わない変数が混在していても、未使用のものはエラーになります。
直し方: (空) を _ = score にします。
パターン4
1 package main 2 3 import "fmt" 4 5 func main() { 6 x := 1 7 y := 2 8 ^ 9 fmt.Println(y) 10 }
xは宣言だけで使われていません。fmt.Println(x)のように使うか、_に代入する必要があります。
直し方: (空) を _ = x にします。
パターン5
1 package main 2 3 import "fmt" 4 5 func main() { 6 value := 42 7 ^ 8 fmt.Println("result") 9 }
valueを宣言した後、一度もその変数を参照していないためコンパイルエラーになります。
直し方: (空) を _ = value にします。
よくある誤解
「使わない変数は警告止まりで、コンパイルは通るはず」という思い込みは誤りです。Goはコンパイラの標準機能として未使用変数を検出し、警告ではなくエラーとして扱います。
実務での勘所
この検査を警告ではなくコンパイルエラーにしているのは、Goの設計者たちがGoogle社内の巨大なC++コードベースで、使われなくなった変数や古いコードが警告を無視されたまま蓄積していく問題を経験していたためです。Goは意図的に、コードの衛生状態に関わるいくつかの問題(未使用変数・未使用importなど)を、無視できる警告ではなく無視できないコンパイルエラーに格上げしています。デバッグ中に一時的に浮いてしまった変数は、_ = xのように書いて明示的に「今は使わない」と示すのがGoらしい対処法です。