Go 言語における switch-case 分岐文

GolangGolangBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

前回の実験では、if-else 分岐文の使い方について学びました。今回の実験では、switch-case 分岐文について学びます。if-else 文と比較すると、switch 文は複数の条件シナリオにより適しています。

ポイント

  • switch-case 文
  • default キーワード
  • fallthrough キーワード

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/BasicsGroup(["Basics"]) go(("Golang")) -.-> go/FunctionsandControlFlowGroup(["Functions and Control Flow"]) go(("Golang")) -.-> go/AdvancedTopicsGroup(["Advanced Topics"]) go/BasicsGroup -.-> go/variables("Variables") go/FunctionsandControlFlowGroup -.-> go/if_else("If Else") go/FunctionsandControlFlowGroup -.-> go/switch("Switch") go/AdvancedTopicsGroup -.-> go/time("Time") subgraph Lab Skills go/variables -.-> lab-149072{{"Go 言語における switch-case 分岐文"}} go/if_else -.-> lab-149072{{"Go 言語における switch-case 分岐文"}} go/switch -.-> lab-149072{{"Go 言語における switch-case 分岐文"}} go/time -.-> lab-149072{{"Go 言語における switch-case 分岐文"}} end

基本構文

switch分岐文の構文はif分岐文のそれと似ており、両方とも条件判定を行います。基本構文は以下の通りです。

switch condition {
    case val1:
        // コードブロック
    case val2:
        // コードブロック
  ...
    default:
        // コードブロック
}

条件は任意の型の式です。条件が特定のcase文の値と一致すると、対応するcase文が実行され、その後プログラムは現在のswitch分岐を抜けます。

case文の値は条件式と同じ型でなければなりません。

プログラムはcase文を上から下に評価し、最初に一致するcase文を実行します。実行が完了すると、現在のswitch分岐を抜けます。

default文はelse文に似ています。他のcase文が条件に一致しない場合、default文が実行されます。

天気予報の例を見てみましょう。新しいファイルを作成してswitch.goと名付け、以下のコードを書きます。

cd ~/project
touch switch.go
package main

import (
    "fmt"
)

func main() {
    // 今日の天気
    weather := "rainy"
    switch weather {
    case "snow":
        fmt.Println("Remember to wear a scarf today.🧣")
    case "rainy":
        fmt.Println("Remember to bring an umbrella today.🌂")
    default:
        fmt.Println("Today is sunny.☀")
    }
}

コードを実行します。

go run switch.go

出力は以下の通りです。

Remember to bring an umbrella today.🌂

この天気予報は、異なる天候条件に基づいて異なる結果を出力します。まず、今日の天気を「rainy」と設定します。以下のswitch-case分岐では、3 つの異なる条件を設定しています。雪が降るときはスカーフを着るようにお知らせし、雨が降るときは傘を持っていくようにお知らせし、それ以外の場合は晴れの日とみなします。

分岐内の複数の値

case文には複数の値を指定することもできます。以下のようになります。

switch condition {
    case val1, val2:
        // コードブロック
 ...
}

天気予報のプログラムを以下のように更新しました。

package main

import (
    "fmt"
)

func main() {
    // 今日の天気
    weather := "snow"
    switch weather {
    case "snow", "stormy":
        fmt.Println("Remember to wear a scarf today.🧣")
    case "haze", "sandstorm":
        fmt.Println("Remember to wear a mask today.😷")
    case "rainy":
        fmt.Println("Remember to bring an umbrella today.🌂")
    default:
        fmt.Println("Today is sunny.☀")
    }
}
go run switch.go

コードを実行すると、以下のような出力になります。

Remember to wear a scarf today.🧣

いくつかの天候条件を追加しました。薄曇りや砂嵐のときはマスクを着用する必要があります。

条件変数のない switch 文

switch文の条件変数はオプションのパラメータです。条件変数を省略すると、switch文はif-else文と同じように動作します。

前節では、条件変数のないswitch文を使って今日の曜日を出力するプログラムを書き直しました。

package main

import (
    "fmt"
    "time"
)

func main() {
    today := time.Now().Weekday()
    switch {
    case today == time.Monday:
        fmt.Println("Today is Monday.")
    case today == time.Tuesday:
        fmt.Println("Today is Tuesday.")
    case today == time.Wednesday:
        fmt.Println("Today is Wednesday.")
    case today == time.Thursday:
        fmt.Println("Today is Thursday.")
    case today == time.Friday:
        fmt.Println("Today is Friday.")
    case today == time.Saturday:
        fmt.Println("Today is Saturday.")
    default:
        fmt.Println("Today is Sunday.")
    }
}
go run switch.go

コードを実行すると、以下のような出力になります。

Today is Monday.

このプログラムでは、switch文から条件変数が削除されています。プログラムを実行すると、各caseブランチの条件が満たされているかどうかがチェックされます。case条件が満たされると、そのブランチのコードが実行され、最後にプログラムはswitchブロックを抜けます。

fallthrough 文

前述の通り、プログラムがcaseブランチを実行した後、現在のswitch分岐を抜けます。

caseブランチを実行した後、次のブランチ文を続けて実行したい場合は、fallthrough文を使用できます。

fallthrough文の使用仕様は以下の通りです。

  • デフォルトでは、switch文がcase 10と一致して実行した後、その後のブランチを続けて実行しません。fallthrough文により、その後のcaseブランチが実行されます。
  • fallthroughは次のcase文のみに影響し、caseのチェックは行いません。
  • fallthroughswitchの最後のブランチでは使用できません。

具体的な例を見てみましょう。

package main

import (
    "fmt"
)

func main() {
    n := 10
    switch n {
    case 10:
        fmt.Println(10)
        fallthrough
    case 3:
        fmt.Println(3)
    }
}
go run switch.go

コードを実行すると、以下のような出力になります。

10
3

switch分岐はcase 10文が一致した後に10を出力し、その後fallthroughの次のcase文を出力します。

switch における初期化文

Go 言語では、if 分岐文だけでなく、switch 分岐文にも初期化文があります。条件変数の前にセミコロンで区切って初期化文を書くことができます。

クイズ

ここでは、前節のプログラムを書き直して、初期化文を switch 文の中に移動させます。

新しいファイルを作成してswitch2.goと名付けます。switch2.goファイルに以下のコードを書き込みます。前節のプログラムを修正して、初期化文をswitch文の中に移動させます。

cd ~/project
touch switch2.go

前節のコードは以下の通りです。

package main

import (
    "fmt"
)

func main() {
    n := 10
    switch n {
    case 10:
        fmt.Println(1)
        fallthrough
    case 3:
        fmt.Println(3)
    }
}

要件

  • switch2.goファイルは~/projectディレクトリの下に配置する必要があります。

ヒント:修正方法については、if-else実験の初期化プログラムのセクションを参照してください。

✨ 解答を確認して練習

まとめ

この実験では、switch分岐文について説明しました。要点は以下の通りです。

  • case文が一致して実行されると、現在のswitchブロックを抜けます。
  • fallthroughを使って、次のcase文を続けて実行することができます。
  • switchには初期化文もあり、条件式とはセミコロンで区切られます。