はじめに
前回の実験では、if-else 分岐文の使い方について学びました。今回の実験では、switch-case 分岐文について学びます。if-else 文と比較すると、switch 文は複数の条件シナリオにより適しています。
ポイント
- switch-case 文
- default キーワード
- fallthrough キーワード
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
前回の実験では、if-else 分岐文の使い方について学びました。今回の実験では、switch-case 分岐文について学びます。if-else 文と比較すると、switch 文は複数の条件シナリオにより適しています。
ポイント
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
文は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
ブロックを抜けます。
前述の通り、プログラムがcase
ブランチを実行した後、現在のswitch
分岐を抜けます。
case
ブランチを実行した後、次のブランチ文を続けて実行したい場合は、fallthrough
文を使用できます。
fallthrough
文の使用仕様は以下の通りです。
switch
文がcase 10
と一致して実行した後、その後のブランチを続けて実行しません。fallthrough
文により、その後のcase
ブランチが実行されます。fallthrough
は次のcase
文のみに影響し、case
のチェックは行いません。fallthrough
はswitch
の最後のブランチでは使用できません。具体的な例を見てみましょう。
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
文を出力します。
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
には初期化文もあり、条件式とはセミコロンで区切られます。