コンテンツにスキップ

Go/switch

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go

Goにおける switch キーワードは、複数の条件に基づいて異なる処理を実行するための制御フロー文です。他の多くのプログラミング言語の switch 文と似ていますが、Go の switch にはいくつかの特徴的な点があります。

基本的な switch 文の構文は以下の通りです。

switch expression {
case value1:
    // expression が value1 と等しい場合に実行されるコード
case value2:
    // expression が value2 と等しい場合に実行されるコード
// ... 他の case
default:
    // どの case にも一致しない場合に実行されるコード (省略可能)
}

switch 文の動作

[編集]
  1. switch の後に続く expression が評価されます。
  2. 評価された値は、各 casevalue と上から順に比較されます。
  3. 最初に一致した case のブロック内のコードが実行されます。
  4. Go の switch 文では、一致した case の処理が完了すると、自動的に switch 文から抜け出します。 明示的に break を記述する必要はありません(記述しても問題ありません)。
  5. どの case にも一致しない場合、default ケースが存在すれば、そのブロック内のコードが実行されます。default ケースは省略可能です。

Go の switch 文の特徴

[編集]
  • break の暗黙的な実行: 他の言語とは異なり、Go の switch では、一致した case の処理が終わると自動的に switch 文から抜け出します。意図的に次の case の処理を実行したい場合は、fallthrough キーワードを使用します。
    package main

    import "fmt"

    func main() {
        num := 2
        switch num {
        case 1:
            fmt.Println("1 です")
        case 2:
            fmt.Println("2 です")
            fallthrough // 次の case の処理も実行する
        case 3:
            fmt.Println("3 です")
        default:
            fmt.Println("その他")
        }
    }
   この例の出力は以下のようになります。
    2 です
    3 です
  • 型スイッチ (Type Switch): switch 文は、変数の型に基づいて処理を分岐させることもできます。これを行うには、switch の後の式で型アサーションを使用します。
    package main

    import "fmt"

    func printType(i interface{}) {
        switch v := i.(type) {
        case int:
            fmt.Printf("%v は int 型です\n", v)
        case string:
            fmt.Printf("%v は string 型です\n", v)
        default:
            fmt.Printf("%v は不明な型です\n", v)
        }
    }

    func main() {
        printType(10)
        printType("hello")
        printType(true)
    }
   この例では、i.(type) によって i の型が評価され、それぞれの型に対応する case の処理が実行されます。
  • タグなし switch (Tagless Switch): switch の後に式を書かずに、各 case で個別の条件を記述することができます。これは、一連の if-else if-...-else 文をより簡潔に記述するのに便利です。
    package main

    import "fmt"

    func main() {
        age := 25
        switch {
        case age < 18:
            fmt.Println("未成年")
        case age >= 18 && age < 65:
            fmt.Println("成人")
        case age >= 65:
            fmt.Println("高齢者")
        }
    }
   この例では、それぞれの case が真偽値を評価する条件式となっています。最初に true と評価された case の処理が実行されます。
  • 複数の値を指定できる case: 一つの case に複数の値をカンマ区切りで指定できます。
    package main

    import "fmt"

    func main() {
        day := "土"
        switch day {
        case "月", "火", "水", "木", "金":
            fmt.Println("平日")
        case "土", "日":
            fmt.Println("週末")
        default:
            fmt.Println("不明な曜日")
        }
    }

まとめ

[編集]

Go の switch キーワードは、複数の条件分岐を効率的に記述するための強力なツールです。暗黙的な breakfallthrough による意図的な次のケースへのフォールスルー、型スイッチによる型の判別、タグなし switch による複雑な条件分岐、そして複数の値を指定できる case など、多様な機能を提供します。これらの特徴を理解することで、より簡潔で可読性の高い Go のコードを書くことができます。