【Go】if・switchで条件分岐する

Go

こんにちは、かつコーチです。
プログラムを書いていると、「条件によって処理を変えたい」という場面は必ず出てきます。
この記事では、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の最後のcasefallthroughを書いてしまったことがあります。

❌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は、ifelse ifが続く場合の見やすい代替になります。
条件分岐が増えてきたら、ifswitchのどちらが読みやすいか意識して使い分けてみてください。

まとめ

この記事のポイント

  • Goのif文は条件式を丸括弧で囲まないのが一般的
  • switchcaseごとにカンマ区切りで複数の値をまとめられる
  • Goのswitchは自動でフォールスルーせず、続けたいときだけfallthroughを書く
  • fallthroughは最後のcaseには書けない

次に読むべき記事

条件分岐が使えるようになったら、次は繰り返し処理を学びましょう。
次回の「for文の基本」で、Goの唯一のループ構文であるfor文を解説します。

タイトルとURLをコピーしました