caseの概要
条件分岐とチャネル処理 Goの予約語 | ||
case 概要 |
||
|
基本的なcaseの使い方
case
はswitch
文の中で条件分岐に使用されます。以下のコードは、整数の値に応じて異なるメッセージを表示する例です。
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
ごとの処理を実行します。- このコードでは、
value
が2
なので、「値は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のときに処理を実行できます。- このコードでは、
value
が3
なので、「値は3または4です」と出力されます。
実行結果:
値は3または4です
caseを使ったチャネル処理(select文)
case
はselect
文の中で、チャネルの送受信を制御する際にも使用されます。
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
にもマッチしない場合の処理を記述するために追加するのが推奨されます。
まとめ
case
はswitch
文とselect
文で使用される。- Goの
switch
では、case
ごとに自動でbreak
が入る。 - チャネルの送受信を制御する場合は
select
内でcase
を使う。 - 複数の条件を指定する場合はカンマで区切る。