undefined: の原因と直し方
宣言していない変数名や関数名を参照すると undefined エラーになります。変数名のタイプミスが典型的な原因です。
エラーメッセージの読み方
./main.go:7:14: undefined: pricee
./main.go- ファイル名
7- 行番号
14- 列番号
undefined: pricee- 詳細メッセージ — 何が問題だったか
このエラーが出る典型パターン
パターン1
1 package main 2 3 import "fmt" 4 5 func main() { 6 price := 1000 7 fmt.Println(pricee) ^ 8 }
./main.go:7:14: undefined: pricee
priceとpriceeは1文字違うだけでも別の名前として扱われ、コンパイラはpriceeを見つけられません。
直し方: pricee を price にします。
広告
広告スロット(未設定)
パターン2
1 package main 2 3 import "fmt" 4 5 func main() { 6 count := 5 7 fmt.Println(cuont) ^ 8 }
./main.go:7:14: undefined: cuont
文字の順番が入れ替わったタイプミスも、Goコンパイラには全く別の名前に見えます。
直し方: cuont を count にします。
パターン3
1 package main 2 3 import "fmt" 4 5 func main() { 6 total := 250 7 fmt.Println(totall) ^ 8 }
./main.go:7:14: undefined: totall
1文字多いだけでも一致しない名前として扱われ、宣言されたことのない値の参照になります。
直し方: totall を total にします。
パターン4
1 package main 2 3 import "fmt" 4 5 func main() { 6 score := 88 7 fmt.Println(scroe) ^ 8 }
./main.go:7:14: undefined: scroe
コンパイラは似た名前を提案してくれますが、実行はしてくれません。正しい名前を書く必要があります。
直し方: scroe を score にします。
パターン5
1 package main 2 3 import "fmt" 4 5 func main() { 6 name := "go" 7 fmt.Println(nmae) ^ 8 }
./main.go:7:14: undefined: nmae
隣り合う文字の入れ替えは見た目で気づきにくいタイプミスの代表例です。
直し方: nmae を name にします。
よくある誤解
「似た名前の変数があれば、コンパイラが自動的に補完してくれるはず」という思い込みは誤りです。Goのコンパイラは厳密な名前の一致を要求し、似た名前を勝手に採用することはありません。
まとめ
undefined:は初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。