Go言語の "redeclared in this block" エラーとは
Go言語では、同一のスコープ内で同じ名前の変数を2回宣言すると "redeclared in this block" のエラーが発生します。
このエラーメッセージは、変数が再宣言されているという意味です。
それでは、具体的なエラー例とその対処法を見ていきましょう。
他のエラーはコチラ
-
【Golang】Go言語でよく発生するエラー一覧8選
Go言語の一般的なエラーとその対処法 これから解説するエラー undefined: [変数名] syntax error: unexpected [トークン], expecting [トークン] re ...
続きを見る
エラー例1:同じ変数を2回宣言する
まず最初に、同じ変数を2回宣言するとどうなるか見てみましょう。
以下にそのようなソースコードを示します。
1 2 3 4 5 6 7 8 9 |
package main import "fmt" func main() { var x int = 10 var x int = 20 fmt.Println(x) } |
上記のコードを実行すると、以下のようなエラーメッセージが表示されます。
出力結果
./prog.go:6:9: x redeclared in this block previous declaration at ./prog.go:5:9
はい、それはダメです。
同じスコープ内では、1つの変数は1度だけ宣言できます。
しかし、既に宣言した変数に新しい値を代入することは可能です。
つまり、上記のソースコードのエラーを解消するには、2つ目のvarを削除すればよいです。
修正後のコードは以下の通りです。
1 2 3 4 5 6 7 8 9 |
package main import "fmt" func main() { var x int = 10 x = 20 fmt.Println(x) } |
出力結果
20
ポイント
エラー例2:関数内でグローバル変数を再宣言する
次に、関数内でグローバル変数を再宣言する場合のエラー例を見ていきましょう。
以下にそのようなソースコードを示します。
1 2 3 4 5 6 7 8 9 10 |
package main import "fmt" var x int = 10 func main() { var x int = 20 fmt.Println(x) } |
上記のコードを実行すると、以下の出力が得られます。
出力結果
20
はい、これはエラーになりません。
なぜなら、関数内で宣言された変数xは、グローバル変数xとは別のスコープに存在するからです。
これを変数の「シャドウイング」(覆い隠す)と言います。
しかし、このようなコードは混乱を招く可能性があるため、避けるべきです。
ポイント
エラー例3:異なる型で同じ変数を再宣言する
異なる型で同じ変数を再宣言するとどうなるか見てみましょう。
以下にそのようなソースコードを示します。
1 2 3 4 5 6 7 8 9 |
package main import "fmt" func main() { var x int = 10 var x string = "Hello" fmt.Println(x) } |
上記のコードを実行すると、以下のようなエラーメッセージが表示されます。
出力結果
./prog.go:6:9: x redeclared in this block previous declaration at ./prog.go:5:9
その通りです。
Goは静的型付け言語であるため、変数は宣言時に型が固定されます。
したがって、既に宣言された変数を異なる型で再宣言することはできません。
ポイント
エラー例4:既に定義された関数を再宣言する
次に、既に定義された関数を再宣言する場合のエラー例を見ていきましょう。
以下にそのようなソースコードを示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package main import "fmt" func printHello() { fmt.Println("Hello") } func printHello() { fmt.Println("Hello, world!") } func main() { printHello() } |
上記のコードを実行すると、以下のようなエラーメッセージが表示されます。
出力結果
./prog.go:9:6: printHello redeclared in this block previous declaration at ./prog.go:5:6
はい、その通りです。
関数も同じ名前の関数を再宣言することはできません。
関数名は一意でなければならないため、同じ名前の関数を再宣言するとエラーになります。
ポイント
エラー例5:同じスコープ内での定数の再宣言
最後に、同じスコープ内で定数を再宣言する場合のエラー例を見ていきましょう。
以下にそのようなソースコードを示します。
1 2 3 4 5 6 7 8 9 10 |
package main import "fmt" const x = 10 const x = 20 func main() { fmt.Println(x) } |
上記のコードを実行すると、以下のようなエラーメッセージが表示されます。
出力結果
./prog.go:6:7: x redeclared in this block previous declaration at ./prog.go:5:7
はい、その通りです。
定数はその値が不変であることを意味しますので、一度宣言した定数を再宣言することはできません。
定数を再宣言しようとすると、コンパイラはエラーを発生させます。
ポイント
まとめ
この記事では、「redeclared in this block」エラーが発生するケースについて5つの例を通じて説明しました。
Goは静的型付け言語であるため、同じスコープ内で同名の変数や関数、定数を再宣言すると、このエラーが発生します。
これを避けるためには、変数名、関数名、定数名を一意にすることが重要です。
また、関数内でグローバル変数と同名の変数を宣言する場合、その変数は関数内でのみ有効となりますが、これは通常避けるべきです。
最後まで読んで頂き、ありがとうございました。少しでもお役にたてたなら幸いです!
他のエラーはコチラ
-
【Golang】Go言語でよく発生するエラー一覧8選
Go言語の一般的なエラーとその対処法 これから解説するエラー undefined: [変数名] syntax error: unexpected [トークン], expecting [トークン] re ...
続きを見る