
こんにちは。よっしーです(^^)
本日は、Go言語の言語仕様について解説しています。
背景
Go言語を学び始めて、公式の「The Go Programming Language Specification(言語仕様書)」を開いてみたものの、「英語で書かれていて読むのが大変…」「専門用語ばかりで何を言っているのかわからない…」と感じたことはありませんか? 実は、多くのGo初心者が同じ壁にぶつかっています。
言語仕様書は、Go言語の「正式な取扱説明書」のような存在です。プログラミング言語がどのように動くのか、どんなルールで書くべきなのかが詳しく書かれていますが、その分、初めて読む人には難しく感じられるのも事実です。
そこでこの記事では、言語仕様書の導入部分を丁寧な日本語訳とともに、初心者の方でも理解しやすい補足説明を加えてお届けします。「強く型付けされている」「ガベージコレクション」「並行プログラミング」といった専門用語も、具体例を交えながらわかりやすく解説していきます。
言語仕様書は難しそうに見えますが、一つひとつの概念を丁寧に読み解いていけば、必ず理解できます。一緒に、Go言語の基礎をしっかり学んでいきましょう!
break文(Break statements)
break 文は、同じ関数内の最も内側の for、switch、または select 文の実行を終了する。
BreakStmt = "break" [ Label ] .
ラベルがある場合、それは囲んでいる for、switch、または 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 は、現在のループや switch、select を途中で抜けるための文です。
for i := 0; i < 100; i++ {
if i == 5 {
break // i が 5 になったらループ終了
}
fmt.Println(i)
}
// 出力: 0, 1, 2, 3, 4
「最も内側」を抜ける
ラベルなしの break は、最も内側の for、switch、select しか抜けません。
for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ {
if j == 3 {
break // 内側の for だけ抜ける。外側は続く
}
}
// ← break はここに来る
}
switch 内の break に注意
Go の switch は自動的にケースの末尾で抜けますが、ケースの途中で抜けたいときに break を使います。ここで注意が必要なのは、switch が for の中にある場合です。
for i := 0; i < 10; i++ {
switch i {
case 5:
break // switch を抜けるだけ! for は抜けない!
}
fmt.Println(i) // i==5 でもここは実行される
}
break が抜けるのは最も内側の switch であって、外側の for ではありません。for を抜けたいなら、ラベルが必要です。
ラベル付き break:外側の構造を抜ける
ラベルをつけると、指定した for、switch、select を直接抜けられます。
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 は、同じ関数内の for、switch、select しか抜けられません。ゴルーチンやクロージャの境界を越えることはできません。
for i := 0; i < 10; i++ {
go func() {
break // コンパイルエラー! この break に対応する for/switch/select がない
}()
}
ゴルーチン内のクロージャは独立した関数なので、外側の for は見えません。
おわりに
本日は、Go言語の言語仕様について解説しました。

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

コメント