Goの`switch`文における`fallthrough`の理解
Olivia Novak
Dev Intern · Leapcell

Key Takeaways
- Goの
switch
文は暗黙的にフォールスルーしません。各caseは自動的にブレークします。 fallthrough
キーワードを使用すると、無条件で次のcaseに実行を継続できます。fallthrough
はcaseブロックの最後のステートメントである必要があり、最後のcaseでは使用できません。
Goでは、switch
文は、式の値に基づいて効率的な分岐を可能にする強力な制御構造です。他のいくつかのプログラミング言語とは異なり、Goのswitch
文は、一致するcaseを実行した後、自動的に break し、CやJavaScriptなどの言語で一般的なフォールスルーの動作を防ぎます。ただし、後続のcaseを実行することが望ましいシナリオもあります。ここで、fallthrough
キーワードが登場します。
Goにおけるswitch
のデフォルトの振る舞い
デフォルトでは、Goのswitch
文でcaseが一致すると、そのcase内のコードが実行され、制御フローはswitch
ブロックを終了します。後続のcaseへの暗黙的なフォールスルーはありません。この動作を示す例を次に示します。
package main import ( "fmt" ) func main() { day := 3 switch day { case 1: fmt.Println("Monday") case 2: fmt.Println("Tuesday") case 3: fmt.Println("Wednesday") case 4: fmt.Println("Thursday") case 5: fmt.Println("Friday") default: fmt.Println("Weekend") } }
出力:
Wednesday
この例では、day
が3
なので、出力は「Wednesday」です。プログラムは後続のcaseの実行を継続しません。
fallthrough
の導入
fallthrough
キーワードを使用すると、式の評価に関係なく、case
が次のcaseに制御を渡すことができます。これは、複数のcaseを順番に実行する必要がある場合に役立ちます。その仕組みを次に示します。
package main import ( "fmt" ) func main() { num := 4 switch num { case 1: fmt.Println("One") fallthrough case 2: fmt.Println("Two") fallthrough case 3: fmt.Println("Three") fallthrough case 4: fmt.Println("Four") fallthrough case 5: fmt.Println("Five") default: fmt.Println("Number out of range") } }
出力:
Four
Five
Number out of range
この例では、num
が4
の場合、プログラムは「Four」を出力し、fallthrough
ステートメントにより、次のcaseのコードの実行を継続し、「Five」を出力してから「Number out of range」を出力します。
重要な考慮事項
-
無条件転送:
fallthrough
キーワードは、無条件で次のcaseに制御を転送します。次のcaseの式を評価しません。したがって、意図しない動作を避けるために、慎重に使用してください。 -
配置の制限:
fallthrough
ステートメントは、caseブロックの最後のステートメントである必要があります。それ以外の場所に配置しようとすると、コンパイル時エラーが発生します。 -
最後のCaseの制限: 制御を転送する後続のcaseがないため、
switch
ステートメントの最後のcaseではfallthrough
を使用できません。
実用的な例
数値の範囲に基づいて数値を分類するシナリオを考えてみましょう。
package main import ( "fmt" ) func main() { num := 75 switch { case num < 50: fmt.Printf("%d is less than 50\n", num) case num < 100: fmt.Printf("%d is less than 100\n", num) fallthrough case num < 200: fmt.Printf("%d is less than 200\n", num) } }
出力:
75 is less than 100
75 is less than 200
ここでは、num
が75
なので、最初のcase(num < 50
)はfalseなのでスキップされます。2番目のcase(num < 100
)はtrueなので、「75 is less than 100」を出力し、次にfallthrough
により、次のcaseに進み、「75 is less than 200」を出力します。
結論
Goのfallthrough
キーワードは、switch
ステートメントで制御を後続のcaseに明示的に渡すメカニズムを提供します。これは特定のシナリオで役立ちますが、コードの明瞭さを維持し、予期しない動作を防ぐために、慎重に使用することが重要です。その動作と制限を理解することで、switch
ステートメントが意図したとおりに機能することが保証されます。
FAQs
いいえ、Goのswitch
は、fallthrough
が明示的に使用されない限り、一致するcaseの後に自動的にブレークします。
いいえ、fallthrough
は無条件で次のcaseに制御を転送します。
実行する後続のcaseがないため、コンパイル時エラーが発生します。
Goプロジェクトのホスティングには、トップチョイスのLeapcellをご利用ください。
Leapcell は、Web ホスティング、非同期タスク、および Redis の次世代サーバーレス プラットフォームです。
多言語サポート
- Node.js、Python、Go、または Rust で開発します。
無制限のプロジェクトを無料でデプロイ
- 使用量に対してのみ料金が発生します — リクエストも料金もかかりません。
比類のないコスト効率
- アイドル料金なしの従量課金制。
- 例: 25 ドルで、平均応答時間 60 ミリ秒で 694 万件のリクエストをサポートします。
合理化された開発者エクスペリエンス
- 簡単なセットアップのための直感的な UI。
- 完全に自動化された CI/CD パイプラインと GitOps の統合。
- 実用的な洞察のためのリアルタイムのメトリクスとロギング。
簡単なスケーラビリティと高いパフォーマンス
- 高い同時実行性を容易に処理するための自動スケーリング。
- 運用上のオーバーヘッドはゼロ — 構築に集中するだけです。
詳細については、ドキュメントをご覧ください。
X でフォローしてください: @LeapcellHQ