こんにちは、かつコーチです。
プログラムを書いていると、「条件によって処理を変えたい」という場面は必ず出てきます。
この記事では、Goの条件分岐の基本であるif文とswitch文の使い方を解説します。
他の言語を経験している方ほど戸惑いやすいポイントもあるので、注意点もあわせて紹介します。
if文の基本
条件式を丸括弧で囲まない
Goのif文は、他の言語と少し見た目が違います。
package main
import "fmt"
func main() {
age := 20
if age >= 20 {
fmt.Println("成人です")
} else {
fmt.Println("未成年です")
}
}
C言語やJavaScriptに慣れている方は、if (age >= 20)のように条件式を丸括弧で囲みたくなるかもしれません。
Goでは条件式を丸括弧で囲む必要がなく、むしろ囲まないのが一般的な書き方です。
一方で、処理をまとめる中括弧{}は省略できません。
else ifで条件を増やす
複数の条件を扱いたいときは、else ifを使います。
score := 75
if score >= 90 {
fmt.Println("優")
} else if score >= 70 {
fmt.Println("良")
} else {
fmt.Println("可")
}
上から順に条件が評価され、最初に一致した処理だけが実行されます。
switch文の基本
基本の書き方
条件分岐が3つ以上になると、ifの連続よりもswitchの方が読みやすくなります。
package main
import "fmt"
func main() {
day := "火"
switch day {
case "月":
fmt.Println("週の始まりです")
case "火", "水", "木":
fmt.Println("平日です")
case "金":
fmt.Println("もうすぐ週末です")
default:
fmt.Println("休日です")
}
}
case "火", "水", "木":のように、カンマで区切って複数の値を1つのcaseにまとめられるのもGoの便利な点です。
他言語との違い:fallthroughが必要
C言語やJavaScriptのswitch文では、caseの処理が終わっても次のcaseに処理が「落ちて」いく、いわゆるフォールスルーが標準の動きです。
そのため、breakを書き忘れると意図せず次のcaseまで実行されてしまいます。
Goのswitchはこの動きが逆で、各caseの処理が終わると自動的にswitch全体を抜けます。
次のcaseに処理を続けたい場合だけ、明示的にfallthroughというキーワードを書く必要があります。
switch num := 1; num {
case 1:
fmt.Println("1です")
fallthrough
case 2:
fmt.Println("2でもあります")
}
このコードを実行すると、1ですと2でもありますの両方が表示されます。
よくあるつまずきポイント・エラー対処
fallthroughの位置を間違える
筆者は以前、JavaScriptの感覚が抜けきらず、switchの最後のcaseにfallthroughを書いてしまったことがあります。
❌Before
switch num := 3; num {
case 1:
fmt.Println("1です")
case 2:
fmt.Println("2です")
default:
fmt.Println("その他です")
fallthrough
}
これをビルドすると、以下のようなエラーが出ます。
fallthrough statement out of place
「fallthroughを書く場所が間違っている」という意味のエラーです。fallthroughは次に続くcaseがある場合にしか使えず、最後のcase(またはdefault)に書くとこのエラーになります。
Goのswitchは自動でフォールスルーしないと知っていたはずなのに、つい他言語の癖で余計なbreakならぬfallthroughを書いてしまったのが原因でした。
✅After
switch num := 3; num {
case 1:
fmt.Println("1です")
case 2:
fmt.Println("2です")
default:
fmt.Println("その他です")
}
fallthroughを削除すれば、正常にビルドできます。
「Goのswitchは何もしなければ自動で抜ける」という前提を体に覚え込ませてから、このミスはしなくなりました。
応用・一歩先の使い方
switchは条件式を省略して、ifの代わりのように使うこともできます。
score := 85
switch {
case score >= 90:
fmt.Println("優")
case score >= 70:
fmt.Println("良")
default:
fmt.Println("可")
}
このように条件式を省略したswitchは、ifとelse ifが続く場合の見やすい代替になります。
条件分岐が増えてきたら、ifとswitchのどちらが読みやすいか意識して使い分けてみてください。
まとめ
この記事のポイント
- Goの
if文は条件式を丸括弧で囲まないのが一般的 switchはcaseごとにカンマ区切りで複数の値をまとめられる- Goの
switchは自動でフォールスルーせず、続けたいときだけfallthroughを書く fallthroughは最後のcaseには書けない
次に読むべき記事
条件分岐が使えるようになったら、次は繰り返し処理を学びましょう。
次回の「for文の基本」で、Goの唯一のループ構文であるfor文を解説します。