Go/break
Goの break キーワードは、ループ処理 (for)、switch 文、select 文 の実行を強制的に終了させるために使用されます。break が実行されると、プログラムの制御は、その break 文が含まれる最も内側のループ、switch 文、または select 文の直後の文に移ります。
break の主な用途と振る舞いは以下の通りです。
for ループ内で break が実行されると、その時点でループの実行が中断され、ループの直後の文に制御が移ります。
package main import "fmt" func main() { for i := 0; i < 10; i++ { if i > 5 { break // i が 5 より大きくなったらループを終了 } fmt.Println(i) } fmt.Println("ループ終了") }
この例では、i が 0 から始まり、5 まで出力された後、i が 6 になった時点で break 文が実行され、ループが終了します。出力は以下のようになります。
0 1 2 3 4 5 ループ終了
switch 文の各 case ブロックの最後に(明示的に記述しなくても)暗黙的に break が実行されます。これにより、一致した case の処理が終わると switch 文から抜け出します。
package main import "fmt" func main() { day := "Wednesday" switch day { case "Monday": fmt.Println("月曜日") case "Tuesday": fmt.Println("火曜日") case "Wednesday": fmt.Println("水曜日") break // 明示的に break を記述しても同じ case "Thursday": fmt.Println("木曜日") case "Friday": fmt.Println("金曜日") default: fmt.Println("週末") } fmt.Println("switch 文終了") }
この例では、day が "Wednesday" なので、対応する case の処理 (fmt.Println("水曜日")) が実行された後、break 文によって switch 文から抜け出し、「switch 文終了」が出力されます。
select 文内で break が実行されると、その時点で select 文の実行が中断され、select 文の直後の文に制御が移ります。これは、複数のチャネル操作のいずれかが準備完了するのを待つ際に、特定の条件で select 文から抜け出すために使用されます。
package main import ( "fmt" "time" ) func main() { ch := make(chan string) quit := make(chan bool) go func() { time.Sleep(2 * time.Second) ch <- "メッセージ" }() go func() { time.Sleep(5 * time.Second) quit <- true }() for { select { case msg := <-ch: fmt.Println("受信:", msg) case <-quit: fmt.Println("終了信号を受信") break // select 文を終了 } fmt.Println("select 文の内部") // quit が送信されるまでは毎回出力される if <-quit { // quit チャネルから値を受信したらループも終了 break // for ループを終了 } } fmt.Println("プログラム終了") }
この例では、quit チャネルから値が送信されると、select 文内の break が実行され、select 文のループから抜け出します。さらに、外側の for ループも break によって終了します。
Goでは、break キーワードにラベルをつけることで、より外側のループや switch 文から抜け出すことができます。
package main import "fmt" func main() { outerLoop: for i := 0; i < 5; i++ { for j := 0; j < 5; j++ { if i*j > 10 { fmt.Println("break outerLoop at i =", i, ", j =", j) break outerLoop // outerLoop というラベルのついたループから抜ける } fmt.Println("i =", i, ", j =", j, ", i*j =", i*j) } } fmt.Println("outerLoop 終了") }
この例では、i*j が 10 を超えると、break outerLoop によって外側の for ループ (outerLoop というラベルが付いている) から直接抜け出します。
まとめ
[編集]break キーワードは、Goの制御フローにおいて、ループ処理や switch 文、select 文から早期に抜け出すための重要なメカニズムです。必要に応じてラベル付き break を使用することで、より複雑な制御構造を扱うことができます。