Go/case
表示
< Go
Goにおける case キーワードは、主に以下の2つの文脈で使用されます。
case は、switch 文の中で、評価される式の値と照合する複数の可能性のある値を定義するために使用されます。switch 文は、与えられた式の値がどの case の値と一致するかを上から順に評価し、最初に一致した case のブロック内のコードを実行します。
switch expression { case value1: // expression が value1 と等しい場合に実行されるコード case value2: // expression が value2 と等しい場合に実行されるコード // ... 他の case default: // どの case にも一致しない場合に実行されるコード (省略可能) }
- 値の比較: 各
caseの後の値は、switchの後のexpressionの評価結果と比較されます。 - 暗黙的な
break: Go のswitch文では、一致したcaseの処理が完了すると、自動的にswitch文から抜け出します。明示的にbreakを記述する必要はありません(記述しても問題ありません)。 - 複数の値を指定: 一つの
caseに複数の値をカンマ区切りで指定できます。
switch day { case "月", "火", "水", "木", "金": fmt.Println("平日") case "土", "日": fmt.Println("週末") }
switch { case age < 18: fmt.Println("未成年") case age >= 18 && age < 65: fmt.Println("成人") }
switch v := i.(type) { case int: fmt.Printf("%v は int 型です\n", v) case string: fmt.Printf("%v は string 型です\n", v) }
case は、select 文の中で、監視するチャネル操作(受信または送信)を定義するために使用されます。select 文は、記述された複数の case のチャネル操作のうち、最初に準備完了したものを実行します。
select { case <-ch1: // ch1 から受信した場合の処理 case ch2 <- value: // ch2 へ送信できた場合の処理 // ... 他の case default: // どのチャネルも準備完了していない場合の処理 (省略可能) }
- チャネル操作: 各
caseは、チャネルからの受信 (<-ch) またはチャネルへの送信 (ch <- value) のいずれかの操作を含みます。 - 準備完了の待機:
select文は、いずれかのcaseのチャネル操作が準備完了するまでブロックします。 - ランダムな選択: 複数の
caseが同時に準備完了した場合、Go はそのうちの1つをランダムに選択して実行します。 defaultケース:defaultケースが存在する場合、どのチャネルもすぐに準備完了していなければ、defaultケースの処理が実行されます(ノンブロッキングなselect)。
まとめ
[編集]case キーワードは、Goにおいて条件分岐を行う switch 文と、並行処理におけるチャネル操作の待機を行う select 文という、異なる2つの重要な制御構造で使用されます。それぞれの文脈で、異なる役割と振る舞いを持っていますが、いずれも複数の可能性の中から一つを選択して処理を実行するという共通の目的を持っています。