ある条件に一致するかしないかによって、それ以降のプログラムの処理を変更することを、条件分岐と言います。プログラミングは、条件分岐と繰り返しで、大部分の処理が可能になります。Go 言語には、if 文と、switch 文という 2種類の条件分岐が用意されています。
package main
import ("math/rand"
"time"
"fmt"
)
func main() {
rand.Seed(time.Now().Unix())
score := rand.Intn(101)
if score >= 60 {
fmt.Printf("テストは %d 点でした。合格です\n", score)
}
}
テストは 98 点でした。合格です
// 60点未満の場合は何も表示されません
rand.Seed(time.Now().Unix())
次の行の、rand.Intn 関数で発生させる乱数は、乱数表に従ったものです。つまり、1 番目の値は ○、2番目の値は、○ とあらかじめ決まっています。上記のコードは、その決まった値を、本当にランダムな値にするために、前もって記述しなければならないコードだと思ってください。
score := rand.Intn(101)
変数 score を定義して、0 から 100 までのランダムな整数で初期化しています。
if score >= 60 {
if キーワードを使うことによって、もし score が、60 以上なら、という意味になります。この条件に合っている場合は、{ と } に囲まれた処理が実行されます。条件に合わない場合は何もしません。
fmt.Printf("テストは %d 点でした。合格です\n", score)
条件に合った場合に実行される処理です。処理は複数行記述することもできます。
}
if の条件に合った場合の処理は、必ず { と } で囲まなければなりません。
package main
import ("math/rand"
"time"
"fmt"
)
func main() {
rand.Seed(time.Now().Unix())
score := rand.Intn(101)
if score >= 60 {
fmt.Printf("テストは %d 点でした。合格です\n", score)
} else {
fmt.Printf("テストは %d 点でした。落第です\n", score)
}
}
// score が 60 未満の場合は
テストは 17 点でした。落第です
// score が 60 以上の場合は
テストは 71 点でした。合格です
} else {
else キーワードを使うことによって、条件に合わなかった場合の処理も記述することができるようになります。
package main
import ("math/rand"
"time"
"fmt"
)
func main() {
rand.Seed(time.Now().Unix())
score := rand.Intn(101)
if score >= 80 {
fmt.Printf("テストは %d 点でした。優秀な成績です\n", score)
} else if score >= 60 {
fmt.Printf("テストは %d 点でした。まあまあです\n", score)
} else {
fmt.Printf("テストは %d 点でした。また、頑張りましょう\n", score)
}
}
// score が 80 以上の場合
テストは 94 点でした。優秀な成績です
// score が 80 未満で 60 以上の場合は
テストは 75 点でした。まあまあです
// score が 60 未満の場合は
テストは 53 点でした。また、頑張りましょう
} else if score >= 60 {
if 条件1 {
条件1に一致した場合の処理
} else if 条件2 {
条件1には一致しなかったが、条件2に一致した場合の処理
} else if 条件3 {
条件1にも条件2にも一致しなかったが、条件3に一致した場合の処理
} else {
どの条件にも一致しなかった場合の処理
}
条件が多くある場合に、else if 文で記述するのは、コードの可読性が悪くなります。そういう場合は switch 文を使うと、コードがすっきりします。
package main
import ("math/rand"
"time"
"fmt"
)
func main() {
rand.Seed(time.Now().Unix())
score := rand.Intn(101)
switch {
case score >= 80:
fmt.Printf("テストは %d 点でした。成績はAです\n", score)
case score >= 70:
fmt.Printf("テストは %d 点でした。成績はBです\n", score)
case score >= 60:
fmt.Printf("テストは %d 点でした。成績はCです\n", score)
default:
fmt.Printf("テストは %d 点でした。また頑張りましょう\n", score)
}
}
// score が 80 以上の場合
テストは 88 点でした。成績はAです
// score が 70 から 79 までの場合
テストは 76 点でした。成績はBです
// score が、60 から 69 までの場合
テストは 62 点でした。成績はCです
// score が 60 未満の場合
テストは 43 点でした。また頑張りましょう
switch 文は switch キーワードのあとの { } の中に、各分岐点をあらわす case キーワードを記述します。
case キーワードのあとには、値もしくは条件式を書きます。そして値もしくは条件式のあとには、:(コロン)を記述します。
それぞれの処理は、case 文の、次の行からはじめます。サンプルでは1行だけの処理でしたが、複数行の処理を記述することもできます。
処理を { } で囲むことはしません。次の case 文があらわれるまで、前の case 文の処理になります。
どの case にも当てはまらなかった場合は、default キーワードの処理が実行されます。
default キーワードのあとにも、:(コロン)をつけます。
どの case にも当てはまらなく、default も記述されていなかった場合は、何も実行されません。
このswitch1.go は、if else のように case のところで条件式を書くための、やや変則的な switch 文です。基本的な switch 文は case のところに値を書きます。
package main
import ("math/rand"
"time"
"fmt"
)
func main() {
rand.Seed(time.Now().Unix())
janken := rand.Intn(3) + 1
switch janken {
case 1:
fmt.Println("相手はグーを出しました")
case 2:
fmt.Println("相手はチョキを出しました")
case 3:
fmt.Println("相手はパーを出しました")
}
}
// 実行するたびに次の3つのうちどれかが表示されます
相手はチョキを出しました
相手はグーを出しました
相手はパーを出しました
swithch1.go と switch2.go の違いは、switch キーワードのあとに、何かの値を記述するかしないかの違いです。
switch キーワードのあとに値を記述した場合は、case キーワードのあとにも値を記述します。そして、switch キーワードと case キーワードの値が一位した場合、その case 文の処理が実行されます。
switch キーワードのあとに値を記述しなかった場合は、case キーワードのあとには条件式を記述します。そして、その条件式が最初に成り立った case 文の処理が実行されます。
どの値や条件式にも一致しなかった場合は、defaut 文の処理が実行されます。
どの値や条件式にも一致せず、default 文もない場合は、何も実行されません。