no new variables on left side of := の原因と直し方
短縮変数宣言 := は左辺に少なくとも1つ新しい変数が必要です。すでに宣言済みの変数だけを左辺に並べて := を使うとコンパイルエラーになります。
エラーメッセージの読み方
./main.go:7:4: no new variables on left side of :=
./main.go- ファイル名
7- 行番号
4- 列番号
no new variables on left side of :=- 詳細メッセージ — 何が問題だったか
このエラーが出る典型パターン
パターン1
1 package main 2 3 import "fmt" 4 5 func main() { 6 x := 5 7 x := 6 ^ 8 fmt.Println(x) 9 }
./main.go:7:4: no new variables on left side of :=
xはすでに宣言済みなので、2回目は:=ではなく単純な=で再代入する必要があります。
直し方: := を = にします。
広告
広告スロット(未設定)
パターン2
1 package main 2 3 import "fmt" 4 5 func main() { 6 n := 10 7 n := 20 ^ 8 fmt.Println(n) 9 }
./main.go:7:4: no new variables on left side of :=
:=は新しい変数を宣言する構文です。左辺がすべて既存の変数なら=を使います。
直し方: := を = にします。
パターン3
1 package main 2 3 import "fmt" 4 5 func main() { 6 total := 100 7 total := 200 ^ 8 fmt.Println(total) 9 }
./main.go:7:8: no new variables on left side of :=
totalという同じ名前の変数をもう一度:=で宣言しようとすると、新しい変数が1つも無いためエラーになります。
直し方: := を = にします。
パターン4
1 package main 2 3 import "fmt" 4 5 func main() { 6 count := 1 7 count := 2 ^ 8 fmt.Println(count) 9 }
./main.go:7:8: no new variables on left side of :=
countの値を更新したいだけなら、宣言をやり直す:=ではなく代入の=で十分です。
直し方: := を = にします。
パターン5
1 package main 2 3 import "fmt" 4 5 func main() { 6 score := 50 7 score := 60 ^ 8 fmt.Println(score) 9 }
./main.go:7:8: no new variables on left side of :=
左辺の変数がすべて既存であれば:=は使えません。代入したいだけの場合は=に置き換えます。
直し方: := を = にします。
よくある誤解
「:=は=と同じ意味で、既存の変数への再代入にも使えるはず」という思い込みは誤りです。:=は新しい変数を宣言する構文で、左辺がすべて既存の変数の場合は単純な=を使う必要があります。
まとめ
no new variables on left side of :=は初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。