Code Fix

初級

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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)