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
    }

ラベルはそれを含む関数内でのみ有効です。別の関数のラベルには飛べません。