コンテンツにスキップ

Go/break

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go


Goの break キーワードは、ループ処理 (for)、switch 文、select の実行を強制的に終了させるために使用されます。break が実行されると、プログラムの制御は、その break 文が含まれる最も内側のループ、switch 文、または select 文の直後の文に移ります。

break の主な用途と振る舞いは以下の通りです。

1. for ループにおける 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
ループ終了

2. switch 文における break

[編集]

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 文終了」が出力されます。

3. select 文における break

[編集]

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 によって終了します。

ラベル付き 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 を使用することで、より複雑な制御構造を扱うことができます。