基本的にプログラムは記述したコードを上から下へと順に実行していきます。しかし、場合によっては特定の条件だけ実行したい処理、実行した結果に応じて処理を分岐させたい時があります。
例えば銀行のATMでお金を引き出すとしましょう。1000円を引き出そうとしましたが残高が足りなければ「残高が足りません。」と表示し、残高が足りていれば出金処理を実行するように、条件に応じて処理を分岐させるのです。
今回はそんな条件分岐のコードの書き方をご紹介していきます。
論理値は『true』か『false』のどちらかを保持するデータ型です。以下のコードでは『b』という論理値型の変数を true で初期化しており、b が true の時だけ『b は true です。』というメッセージが表示されるようになっています。
1 2 3 4 5 6 7 | b := true if b { // b が true の時だけ実行される。 fmt.Println("b は true です。") } fmt.Println("条件分岐が終わると、この文が表示される。") |
上記のコードで『if』というものが登場していますね。『if』と書くと次に書いた『条件式』を評価し、その条件式の内容が正しければ『if』の後の『{ }』で囲まれたブロック内のコードを実行します。
イメージとしては以下のようになります。
1 2 3 | if 条件式 { // 条件式の内容が正しければ、このブロック内に書いたコードが実行される。 } |
『if b { ...』と書いただけでは、条件式に該当するのは『b』という1文字でありますが、これも式になります。b には true が入っているので式の評価の結果は『true』であり、ブロック内のコードが実行されます。
もし、b を false で初期化していれば『if』の後のブロック内は実行されません。
さて、『if b { ...』と書くことで b が true の時は ifブロック内のコードが実行されましたが、b が false の場合も処理を書きたいですよね。
そんな時は以下のコードのように『else』ブロックを追加します。
1 2 3 4 5 6 7 8 9 | b := false if b { // b が true ではなかったので、ここは実行されない。 fmt.Println("b は true です。") } else { // if で書いた条件に該当しなかったので、ここが実行される。 fmt.Println("b は false です。") } |
『else』ブロック内のコードは、まず『if』で書いた条件式を評価し、その内容が正しくなかった場合に実行されます。
上の例では、if で『b』が true であるかを評価しましたが、b は false で初期化されているので ifブロック内のコードは実行されません。しかし『else』ブロックを用意してあるので『b は false です。』と表示されます。
以下のコードのように、else の前に改行を入れてしまうとエラーになります。
1 2 3 4 5 6 7 8 | b := false if b { fmt.Println("b は true です。") } else { // else の前に改行を入れてはいけない fmt.Println("b は false です。") } |
今までは b が true であるかを評価していましたが、b が false であるかを直接調べたい時もありますよね。そんな時は b の前に『!』を付けて『!b』と書きましょう。
1 2 3 4 5 | b := false if !b { fmt.Println("b は false です。") } |
上記のコードで『b が true ではない時、ifブロック内のコードを実行する』という風になり、否定するような条件式になります。
論理値での条件分岐は非常にシンプルです。しかし柔軟性には欠けるものですし、数値での分岐やもっと柔軟な条件分岐もしていきたいですよね。
以下のコードでは150という数値で初期化した変数i を用意し、if文で i が100より大きいかどうかを比較しています。
1 2 3 4 5 6 7 | i := 150 if i > 100 { fmt.Println("i は 100より大きいです。") } else { fmt.Println("i は 100以下です。") } |
上のコードでの条件式は『i > 100』という部分になり、i が100より大きければ評価結果が true になり、『i は 100より大きいです。』というメッセージが表示され、評価結果が false『i は100より大きくなかった』、つまり『i は 100以下』の場合は elseブロックで処理されます。
このように2つのデータを比較するような『>』などを比較演算子と呼びます。
比較演算子は他にも様々なものがあるので、それらをご紹介していきます。
『A < B』と書くと、AはBより小さいかどうかを評価するようになります。
『A >= B』と書くと、AはB以上かどうかを評価。
『A <= B』と書くと、AはB以下かどうか。
『A == B』と書くと、AとBが等しいかどうか。『A = B』と書くとエラーになりますのでご注意を。
『A != B』と書くと、AとBが一致しないかどうか。
更に柔軟に比較を行うためには、複数の条件を同時に評価する必要がでてきます。以下のコードでは『i >= 100』と『i <= 200』という2つの条件式を同時に比較し、評価結果が2つとも true であれば、ifブロック内の処理が実行されます。
1 2 3 4 5 6 7 | i := 300 if i >= 100 && i <= 200 { fmt.Println("i は 100以上200以下です。") } else { fmt.Println("i は 100より小さいか、200より大きいです。") } |
上のコードでは2つの条件式の間に『&&』という記号を記述しており、これを書くことで両隣の2つの条件が2つとも『true』と評価され場合に、ifブロック内を実行するようになります。
どちらか一方、もしくは両方が『true』の場合に ifブロック内を実行したい場合は『||』という記号を書きます。
1 2 3 4 5 6 7 | i := 100 if i == 100 || i == 200 { fmt.Println("i は100か200です。") } else { fmt.Println("i は100でも200でもない数値です。") } |
『&&』を使えば複数の条件を繋いで、全ての評価結果が true なら実行するようなコードも書けます。以下がその例です。
1 2 3 4 5 6 7 | i := 156 if i >= 100 && i <= 200 && (i%2) == 0 && (i%3) == 0 { fmt.Println("i は100以上200以下で、2と3の両方の倍数です。") } else { fmt.Println("i は100より小さいか、200より大きく、2の倍数でも3の倍数でもありません。") } |
数値が0の時はこの処理…1の時はこれ、2の時はこれ、という風に複数の条件があって、条件ごとに別々の処理を実行させたい時は『else if』と書いて条件を分岐させます。
以下のコードでは i に3が入っているので4番目の条件が一致し『i は3です。』というメッセージだけが表示されます。他のメッセージは表示されません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | i := 3 if i == 0 { // 評価される fmt.Println("i は0です。") // 表示されない } else if i == 1 { // 評価される fmt.Println("i は1です。") // 表示されない } else if i == 2 { // 評価される fmt.Println("i は2です。") // 表示されない } else if i == 3 { // 評価される fmt.Println("i は3です。") // 表示される } else if i == 4 { // 評価されない fmt.Println("i は4です。") // 表示されない } else { fmt.Println("i は0でも1でも2でも3でも4でもありません。") // 表示されない } |
上のコードの流れとしては、まず i が0と一致するかどうかを比較します。しかし一致しないので次の条件式へと移動し、1と一致するかどうかを比較します。これを繰り返して3と一致してメッセージを表示させたら、一致した条件が見つかったので4と比較することはありません。
条件式では文字列との比較も可能です。
1 2 3 4 5 | msg := "おはよう!" if msg == "おはよう!" { fmt.Println("おはようございます!") } |
条件分岐、比較演算子などを使いこなして柔軟に処理出来るプログラムを作って見て下さいね。