コンテンツにスキップ

Go/case

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

Goにおける case キーワードは、主に以下の2つの文脈で使用されます。

1. switch 文の中

[編集]

case は、switch 文の中で、評価される式の値と照合する複数の可能性のある値を定義するために使用されます。switch 文は、与えられた式の値がどの case の値と一致するかを上から順に評価し、最初に一致した case のブロック内のコードを実行します。

switch expression {
case value1:
    // expression が value1 と等しい場合に実行されるコード
case value2:
    // expression が value2 と等しい場合に実行されるコード
// ... 他の case
default:
    // どの case にも一致しない場合に実行されるコード (省略可能)
}

switch 文における case の特徴:

[編集]
  • 値の比較:case の後の値は、switch の後の expression の評価結果と比較されます。
  • 暗黙的な break: Go の switch 文では、一致した case の処理が完了すると、自動的に switch 文から抜け出します。明示的に break を記述する必要はありません(記述しても問題ありません)。
  • 複数の値を指定: 一つの case に複数の値をカンマ区切りで指定できます。
   switch day {
   case "月", "火", "水", "木", "金":
       fmt.Println("平日")
   case "土", "日":
       fmt.Println("週末")
   }
  • 条件式: タグなし switch 文では、各 case の後に真偽値を返す条件式を記述できます。最初に true と評価された case のブロックが実行されます。
   switch {
   case age < 18:
       fmt.Println("未成年")
   case age >= 18 && age < 65:
       fmt.Println("成人")
   }
  • 型スイッチ: switch 文は、変数の型に基づいて処理を分岐させる型スイッチでも case を使用します。
   switch v := i.(type) {
   case int:
       fmt.Printf("%v は int 型です\n", v)
   case string:
       fmt.Printf("%v は string 型です\n", v)
   }

2. select 文の中

[編集]

case は、select 文の中で、監視するチャネル操作(受信または送信)を定義するために使用されます。select 文は、記述された複数の case のチャネル操作のうち、最初に準備完了したものを実行します。

select {
case <-ch1:
    // ch1 から受信した場合の処理
case ch2 <- value:
    // ch2 へ送信できた場合の処理
// ... 他の case
default:
    // どのチャネルも準備完了していない場合の処理 (省略可能)
}

select 文における case の特徴:

[編集]
  • チャネル操作:case は、チャネルからの受信 (<-ch) またはチャネルへの送信 (ch <- value) のいずれかの操作を含みます。
  • 準備完了の待機: select 文は、いずれかの case のチャネル操作が準備完了するまでブロックします。
  • ランダムな選択: 複数の case が同時に準備完了した場合、Go はそのうちの1つをランダムに選択して実行します。
  • default ケース: default ケースが存在する場合、どのチャネルもすぐに準備完了していなければ、default ケースの処理が実行されます(ノンブロッキングな select)。

まとめ

[編集]

case キーワードは、Goにおいて条件分岐を行う switch 文と、並行処理におけるチャネル操作の待機を行う select 文という、異なる2つの重要な制御構造で使用されます。それぞれの文脈で、異なる役割と振る舞いを持っていますが、いずれも複数の可能性の中から一つを選択して処理を実行するという共通の目的を持っています。