Go言語のfallthroughを使ってswitch文のcaseを連続実行する方法についてわかりやすく解説

スポンサーリンク
スポンサーリンク

fallthroughの概要

switchの連続実行制御 Goの予約語

fallthrough

概要fallthroughは、Goのswitch文で次のcaseブロックを強制的に実行するためのキーワードです。

  • 通常、Goのswitch文ではcaseの後に暗黙のbreakがあるため、1つのcaseのみ実行される。
  • fallthroughを使うと、次のcaseブロックも実行できる。
  • ただし、fallthroughを使用すると、次のcaseの条件は評価されず、無条件で実行される。

基本的なfallthroughの使い方

fallthroughを使うと、次のcaseブロックが続けて実行されます。

package main

import "fmt"

func main() {
    num := 2

    switch num {
    case 1:
        fmt.Println("値は1です")
    case 2:
        fmt.Println("値は2です")
        fallthrough
    case 3:
        fmt.Println("値は3です(fallthroughにより実行)")
    default:
        fmt.Println("値は1, 2, 3のいずれでもありません")
    }
}

解説:

  • case 2: が一致し、「値は2です」が出力される。
  • fallthroughがあるため、条件を評価せずに次のcasecase 3:)も実行される。

実行結果:

値は2です
値は3です(fallthroughにより実行)

fallthroughを使ったランク評価の例

例えば、スコアに応じたランク評価をする際にfallthroughを使うと、特定のスコア以上の評価をすべて表示できます。

package main

import "fmt"

func main() {
    score := 85

    switch {
    case score >= 90:
        fmt.Println("Sランク")
        fallthrough
    case score >= 80:
        fmt.Println("Aランク")
        fallthrough
    case score >= 70:
        fmt.Println("Bランク")
        fallthrough
    default:
        fmt.Println("ランクなし")
    }
}

解説:

  • scoreが85のため、case score >= 80が該当し、「Aランク」が出力される。
  • fallthroughがあるため、条件を無視して「Bランク」も出力される。
  • さらにfallthroughにより、「ランクなし」も実行される。

実行結果:

Aランク
Bランク
ランクなし

fallthroughの注意点

Goのfallthroughは無条件で次のcaseを実行するため、適切に使用しないと予期しない動作を引き起こす可能性があります。

package main

import "fmt"

func main() {
    value := 10

    switch value {
    case 10:
        fmt.Println("値は10です")
        fallthrough
    case 20:
        fmt.Println("値は20です(fallthroughにより実行)")
    default:
        fmt.Println("その他の値")
    }
}

解説:

  • 変数value10なので、case 10:が実行される。
  • fallthroughにより、次のcase 20:も実行されるが、valueが20かどうかはチェックされない。

実行結果:

値は10です
値は20です(fallthroughにより実行)

fallthroughを使わずに複数のcaseを処理する方法

Goではfallthroughを使わなくても、複数のcaseをグループ化できます。

package main

import "fmt"

func main() {
    day := "土曜日"

    switch day {
    case "月曜日", "火曜日", "水曜日", "木曜日", "金曜日":
        fmt.Println("平日です")
    case "土曜日", "日曜日":
        fmt.Println("週末です")
    default:
        fmt.Println("無効な曜日です")
    }
}

解説:

  • case "月曜日", "火曜日", ... のように、カンマ区切りで複数の条件を指定できる。
  • この方法なら、条件を満たすものだけが実行され、無駄な処理が発生しない。

実行結果:

週末です

注意事項

  • fallthroughは条件を無視する: 次のcaseの条件が満たされていなくても実行されるため、意図しない動作につながることがある。
  • 最後のcaseでfallthroughを使うとエラー: fallthroughは次のcaseが存在しないとエラーになる。
  • Goのswitchはbreakがデフォルト: 他の言語とは異なり、Goではcaseごとに暗黙のbreakがあるため、通常はfallthroughを使わなくても問題ない。

よくある質問

Q: Goのswitchではなぜfallthroughが必要なのですか?
A: Goのswitchはデフォルトでbreakが適用されるため、明示的に次のcaseを実行したい場合にfallthroughが必要です。
Q: fallthroughを使わない方が良いですか?
A: 多くの場合は不要ですが、特定の条件で次のcaseも実行したい場合には便利です。
Q: fallthroughを使うときの注意点は?
A: 次のcaseの条件を無視して実行されるため、意図しない動作を引き起こさないように注意が必要です。

まとめ

  • fallthroughを使うと、次のcaseの条件を無視して強制的に実行できる。
  • 通常のGoのswitchは各caseに暗黙のbreakがあるため、fallthroughなしでは次に進まない。
  • 多用すると可読性が低下するため、必要な場面でのみ使用するのが望ましい。