Go言語のブロックとスコープ
2026/09/13
ブロック
ブロックは宣言と文のグループです。波括弧{ }で囲みます。関数本体、制御構文の本体、ifの初期化文を含む全体などがブロックを形成します。
スコープ
識別子は宣言されたブロックとその内側のブロックで有効です。内側のブロックで同名を宣言すると、外側の名前はそのブロック内では隠れます。
x := 1
y := 2
{
fmt.Println(y) // 2
x := 3
fmt.Println(x) // 3
}
fmt.Println(x) // 1再宣言と:=
:=は、左辺に少なくとも1つ新しい変数があるときに使います。すでにそのブロックで宣言されている名前には代入され、それ以外は新たに宣言されます。
x, y := 1, 2
x, z := 3, 4 // xは代入、zは新規ラベルのスコープ
ラベルは、Outer:のように文の前に付ける名前です。入れ子のループで外側へ抜けるときはbreak Outer、外側ループの次の反復へ進むときはcontinue Outerと書きます。gotoの飛び先にも使います。
Outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if j == 1 {
break Outer // 内側も外側も抜け、両方のループを終了
}
}
}Outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if j == 1 {
continue Outer // 内側を抜け、外側ループの次のiへ
}
}
}i := 0
Again:
fmt.Println(i)
i++
if i < 3 {
goto Again
}ラベルはそれを含む関数内でのみ有効です。別の関数のラベルには飛べません。