#switch文
switch文は、変数の値を「case」で始まる文で評価して条件が満たされれば特定の処理を行います。一度でも条件が満たされれば再び評価はしません。条件が満たされなかった場合は何もせずに終わります。複数の「case文」を用いて場合分けをし、値を示させます。switch文の後に変数名を記述し、どの変数の値について「スイッチ」させるか決めます。
package main
import "fmt"
func main() {
pushs := []string{"S", "N", "R", "C", "E"}
for i := 0; i < len(pushs); i++ {
switch pushs[i] {
case "R":
fmt.Printf("[%s] 実行します。 \n", pushs[i])
case "S":
fmt.Printf("[%s] ファイルを保存します。 \n", pushs[i])
case "N":
fmt.Printf("[%s] 次に進みます。 \n", pushs[i])
case "E":
fmt.Printf("[%s] 終了します \n", pushs[i])
default:
fmt.Printf("[%s] 最初からやり直して下さい。 \n", pushs[i])
}
}
}
###実行結果
[S] ファイルを保存します。
[N] 次に進みます。
[R] 実行します。
[C] 最初からやり直して下さい。
[E] 終了します
case文は値を示すだけです。switch文は全体を{ }で囲みますが、case文は囲む必要ありません。case文はいくらでも書くことができますが、default文を持って終了します。
##式の値で場合分け
case文で数値の大小関係を評価してみましょう。スライスを用いて病院内で感染してしまった患者さんを年齢別に集計するプログラムを作成してみます。
package main
import "fmt"
func main() {
age := []int{19, 21, 23, 48, 36, 26, 33, 39, 67, 31, 55}
clus := [4]int{}
patient := true
for i := 0; i < len(age); i++ {
switch patient {
case age[i] > 59:
clus[3]++
case age[i] > 49:
clus[2]++
case age[i] > 29:
clus[1]++
default:
clus[0]++
}
}
fmt.Printf("院内感染者%d名のうち : \n", len(age))
fmt.Printf("60代以上は%d名\n", clus[3])
fmt.Printf("50-60代は%d名\n", clus[2])
fmt.Printf("30-40代以は%d名\n", clus[1])
fmt.Printf("30代以下は%d名\n", clus[0])
}
###実行結果
院内感染者11名のうち :
60代以上は1名
50-60代は1名
30-40代以は5名
30代以下は4名
switch文で評価する変数patientにブール型である固定値trueが代入してあります。clusが見ている配列から要素を取り出してswitch文を評価する度、case文の内容が変わります。GO言語のswitch文は、前に書いてある条件に合致して処理されたら、次の条件に合致しても無視されるので、式の値がtrueかfalseかで場合分けする場合はpatientのような変数を以下のように省略して書きます。
switch {
case age[i] > 59:
case age[i] > 49:
case age[i] > 29:
default:
}
配列clusを作成して、値が整数0である要素を4つ自動で作成しています。この配列からは、要素clus[0],clus[1],clus[2],clus[3]の値を操作できます。それぞれの要素を「60歳以上の人数」「50歳以上の人数」「30歳以上の人数」「それ以外の年代の人数」として、for文の中のswitch文が書かれています。
#for文とswitch文を組合せコードを綺麗に
caseの条件に当てはまらなければ何もせず次の繰り返しに進むことができるのでそれを利用し、コードをすっきりまとめ上げます。
package main
import "fmt"
func main() {
then := 6789
fmt.Println(then)
for n := 0; n < then; n++ {
switch {
case n == 0:
case n == 1:
case then%n == 0:
then /= n
fmt.Printf("を%dで割ると、 %d\n", n, then)
default:
}
}
}
###実行結果
6789
を3で割ると、 2263
を31で割ると、 73
nが0と1のときは何もせず、ただnを増やすだけなので、0で除算するリスクを避け条件の書き方を簡単にします。