実装
func main() {
x := 10
fmt.Println("outter block", x)//10
if x > 5 {
fmt.Println("inner block", x)//10
x := 5
fmt.Println("inner block", x)//5
}
fmt.Println("outter block", x)//10
上記のxで変数宣言したものは条件分岐より外では、10になります。ブロック内で再宣言すると値が隠蔽され、5になります。そして、ブロック外では最初に宣言した値にアクセスでき、再び10になります。この性質をシャドーイングと言います。
func main() {
var x int = 10
fmt.Println("Outside block:", x) // 10
{
var x int = 20 // ここで新しい変数を宣言しようとすると、エラーが発生します。
fmt.Println("Inside block:", x)
}
fmt.Println("Outside block again:", x)
}
上記のようにvar
で変数宣言をすると、ブロック内での再宣言でエラーが発生します。シャドーイングを避けることができます。
まとめ
-
:=
を使用した短い変数宣言は、新しい変数を作成し、シャドーイングを引き起こす可能性があります。 -
var
を使用した宣言は、既存の変数と同じ名前で再宣言しようとするとエラーが発生するため、シャドーイングを避けることができます。