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を使う。 - 複数の条件を指定する場合はカンマで区切る。