Go言語のcaseで条件分岐とselect文の使い方をわかりやすく解説

スポンサーリンク
スポンサーリンク

caseの概要

条件分岐とチャネル処理 Goの予約語

case

概要caseは、Goのswitch文やselect文で分岐処理を行うために使用されます。

  • switch文で異なる条件を評価するために使用する。
  • select文で複数のチャネルの送受信を待機するために使用する。
  • Goのswitch文ではbreakが暗黙的に適用されるため、明示的に記述する必要がない。

基本的なcaseの使い方

caseswitch文の中で条件分岐に使用されます。以下のコードは、整数の値に応じて異なるメッセージを表示する例です。

package main

import "fmt"

func main() {
    value := 2

    switch value {
    case 1:
        fmt.Println("値は1です")
    case 2:
        fmt.Println("値は2です")
    case 3:
        fmt.Println("値は3です")
    default:
        fmt.Println("値は1, 2, 3のいずれでもありません")
    }
}

解説:

  • switch valueの値に応じて、caseごとの処理を実行します。
  • このコードでは、value2なので、「値は2です」と出力されます。
  • defaultを指定すると、どのcaseにも該当しない場合の処理を記述できます。

実行結果:

値は2です

caseで複数の条件を指定

caseでは、複数の条件をカンマ区切りで記述することができます。

package main

import "fmt"

func main() {
    value := 3

    switch value {
    case 1, 2:
        fmt.Println("値は1または2です")
    case 3, 4:
        fmt.Println("値は3または4です")
    default:
        fmt.Println("値は1, 2, 3, 4のいずれでもありません")
    }
}

解説:

  • case 1, 2:のように記述すると、valueが1または2のときに処理を実行できます。
  • このコードでは、value3なので、「値は3または4です」と出力されます。

実行結果:

値は3または4です

caseを使ったチャネル処理(select文)

caseselect文の中で、チャネルの送受信を制御する際にも使用されます。

package main

import (
    "fmt"
    "time"
)

func main() {
    ch1 := make(chan string)
    ch2 := make(chan string)

    go func() {
        time.Sleep(2 * time.Second)
        ch1 <- "チャネル1のデータ"
    }()

    go func() {
        time.Sleep(1 * time.Second)
        ch2 <- "チャネル2のデータ"
    }()

    select {
    case msg := <-ch1:
        fmt.Println("受信:", msg)
    case msg := <-ch2:
        fmt.Println("受信:", msg)
    }
}

解説:

  • 2つのチャネルを用意し、異なるゴルーチンから送信します。
  • select文内でcaseを使用し、どちらかのチャネルからデータを受信できた時点でその処理を実行します。
  • このコードでは、1秒後にch2が送信されるため、「受信: チャネル2のデータ」が出力されます。

実行結果:

受信: チャネル2のデータ

注意事項

  • switchのcaseでは自動でbreakが適用される: 明示的にbreakを書く必要はない。
  • case内で複数の条件を指定できる: カンマ区切りで複数の値をマッチさせられる。
  • selectのcaseはチャネルの送受信専用: 通常の値の比較には使用できない。

よくある質問

Q: Goのswitch文ではなぜbreakが不要なのですか?
A: Goのswitch文では、各caseブロックの終わりに自動的にbreakが適用されるため、明示的に記述する必要がありません。
Q: caseで条件式を使うことはできますか?
A: はい。case内に条件式を記述できます。例えばcase x > 10:のように使えます。
Q: selectのcaseは通常の条件分岐に使えますか?
A: いいえ。selectはチャネルの送受信専用であり、通常の値の比較には使用できません。
Q: switchでdefaultは必ず必要ですか?
A: いいえ。省略可能ですが、どのcaseにもマッチしない場合の処理を記述するために追加するのが推奨されます。

まとめ

  • caseswitch文とselect文で使用される。
  • Goのswitchでは、caseごとに自動でbreakが入る。
  • チャネルの送受信を制御する場合はselect内でcaseを使う。
  • 複数の条件を指定する場合はカンマで区切る。