今回はgolangで「redeclared in this block」というエラーが出たときの原因と解決策について紹介していきます。
golangで「redeclared in this block」というエラーが出た
golangで開発を行っていると「redeclared in this block」というエラーに遭遇します。
redeclaredは「再宣言された」という意味があります。既にブロックの中で変数や関数が定義されていて、同じ名前の変数や関数を定義しようとするとこのエラーが発生することがほとんどです。
「redeclared in this block」の原因と対処法
変数名が重複している
同一スコープ内で変数aを二回定義してしようとしていますが、この場合はredeclared in this blockが発生します。
func main() {
var a int = 1
var a int = 2
fmt.Println(a)
}
このコードを実行すると以下のように変数aが二回定義されているということでエラーとなります。
main.go:7:6: a redeclared in this block
main.go:6:6: other declaration of a (exit status 1)
上記のエラーを解消するためには変数aの定義を二回行わずに、以下のように上書きを行うか、別の変数として定義をします。
func main() {
var a int = 1
a = 2
fmt.Println(a)
}
func main() {
var a int = 1
var b int = 2
fmt.Println(a, b)
}
既に宣言している変数に新たに値を代入する際はvarや型の宣言は行わずに「=」のみで代入をすることができます。
定数名が重複している
golangではconstを用いることで定数の宣言をすることができます。
しかしこのconstの場合でも同じ定数名を2回定義するとredeclared in this blockエラーが発生します。
const a = 1
const a = 2
func main() {
fmt.Println(a)
}
このコードを実行すると定数aが再定義されてしまっているという旨のエラーが発生します。
main.go:6:7: a redeclared in this block
main.go:5:7: other declaration of a (exit status 1)
定数は値の上書きをすることができないため、対処法としては別の定数として宣言するしかありません。
const a = 1
const b = 2
func main() {
fmt.Println(a, b)
}
関数名が重複している
関数名が重複していてもredeclared in this blockエラーが発生します。
func main() {
a := 1
fmt.Println(a)
}
func main() {
b := 2
fmt.Println(b)
}
このコードを実行すると以下のようなエラーが出力されます。
mainという関数が既に定義されているため再定義しようとしてエラーになっているということがわかります。
main.go:10:6: main redeclared in this block
main.go:5:6: other declaration of main (exit status 1)
関数も上書きできないため、関数名を変えて定義するか、別のスコープに定義してエラーを回避しましょう。
golangをもっと詳しくなりたい方に
golang学習のために筆者が実際に受講したUdemy教材をまとめています。
golang学習のために筆者が実際に読んでおすすめしたい本をまとめています。