Go言語入門:言語仕様 -Vol.119-

スポンサーリンク
Go言語入門:言語仕様 -Vol.119- 用語解説
Go言語入門:言語仕様 -Vol.119-
この記事は約6分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

本日は、Go言語の言語仕様について解説しています。

スポンサーリンク

背景

Go言語を学び始めて、公式の「The Go Programming Language Specification(言語仕様書)」を開いてみたものの、「英語で書かれていて読むのが大変…」「専門用語ばかりで何を言っているのかわからない…」と感じたことはありませんか? 実は、多くのGo初心者が同じ壁にぶつかっています。

言語仕様書は、Go言語の「正式な取扱説明書」のような存在です。プログラミング言語がどのように動くのか、どんなルールで書くべきなのかが詳しく書かれていますが、その分、初めて読む人には難しく感じられるのも事実です。

そこでこの記事では、言語仕様書の導入部分を丁寧な日本語訳とともに、初心者の方でも理解しやすい補足説明を加えてお届けします。「強く型付けされている」「ガベージコレクション」「並行プログラミング」といった専門用語も、具体例を交えながらわかりやすく解説していきます。

言語仕様書は難しそうに見えますが、一つひとつの概念を丁寧に読み解いていけば、必ず理解できます。一緒に、Go言語の基礎をしっかり学んでいきましょう!

break文(Break statements)

break 文は、同じ関数内の最も内側の forswitch、または select 文の実行を終了する。

BreakStmt = "break" [ Label ] .

ラベルがある場合、それは囲んでいる forswitch、または select 文のラベルでなければならず、その文の実行が終了する。

OuterLoop:
	for i = 0; i < n; i++ {
		for j = 0; j < m; j++ {
			switch a[i][j] {
			case nil:
				state = Error
				break OuterLoop
			case item:
				state = Found
				break OuterLoop
			}
		}
	}

解説

break の基本

break は、現在のループや switchselect を途中で抜けるための文です。

for i := 0; i < 100; i++ {
    if i == 5 {
        break  // i が 5 になったらループ終了
    }
    fmt.Println(i)
}
// 出力: 0, 1, 2, 3, 4

「最も内側」を抜ける

ラベルなしの break は、最も内側forswitchselect しか抜けません。

for i := 0; i < 10; i++ {
    for j := 0; j < 10; j++ {
        if j == 3 {
            break  // 内側の for だけ抜ける。外側は続く
        }
    }
    // ← break はここに来る
}

switch 内の break に注意

Go の switch は自動的にケースの末尾で抜けますが、ケースの途中で抜けたいときに break を使います。ここで注意が必要なのは、switchfor の中にある場合です。

for i := 0; i < 10; i++ {
    switch i {
    case 5:
        break  // switch を抜けるだけ! for は抜けない!
    }
    fmt.Println(i)  // i==5 でもここは実行される
}

break が抜けるのは最も内側の switch であって、外側の for ではありません。for を抜けたいなら、ラベルが必要です。

ラベル付き break:外側の構造を抜ける

ラベルをつけると、指定した forswitchselect を直接抜けられます。

OuterLoop:
    for i := 0; i < n; i++ {
        for j := 0; j < m; j++ {
            switch a[i][j] {
            case nil:
                state = Error
                break OuterLoop  // 外側の for を抜ける
            case item:
                state = Found
                break OuterLoop  // 外側の for を抜ける
            }
        }
    }
// ← break OuterLoop はここに来る

この例では switch → 内側の for → 外側の for という3重の入れ子がありますが、break OuterLoop で一気に外側の for まで抜けられます。

ラベル付き break がよく使われる場面

1. ネストしたループからの脱出

found := false
search:
    for i := range matrix {
        for j := range matrix[i] {
            if matrix[i][j] == target {
                found = true
                break search
            }
        }
    }

2. select ループの終了

loop:
    for {
        select {
        case msg := <-ch:
            if msg == "quit" {
                break loop  // select ではなく for を抜ける
            }
            process(msg)
        case <-timeout:
            break loop
        }
    }

select の中でラベルなしの break を書くと select だけを抜けるので、ループが止まりません。for ごと抜けたいときは必ずラベル付き break を使いましょう。

break は同じ関数内でのみ有効

break は、同じ関数内forswitchselect しか抜けられません。ゴルーチンやクロージャの境界を越えることはできません。

for i := 0; i < 10; i++ {
    go func() {
        break  // コンパイルエラー! この break に対応する for/switch/select がない
    }()
}

ゴルーチン内のクロージャは独立した関数なので、外側の for は見えません。

おわりに 

本日は、Go言語の言語仕様について解説しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました