Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
switch
Goのswitch文は条件に応じた多分岐処理を記述します。他の言語と異なり、各caseの最後に自動的にbreakされるため、『fallthrough』を明示しない限り次のcaseには落ちません。
構文
// 基本のswitch
switch 式 {
case 値1:
// 処理
case 値2, 値3: // カンマで複数の値をまとめられる
// 処理
default:
// どのcaseにも一致しない場合
}
// 条件式なしのswitch(if-else if の代替)
switch {
case 条件式1:
// 処理
case 条件式2:
// 処理
}
// 初期化式付きswitch
switch 初期化式; 式 {
}
// 型スイッチ(interface{}の型を判別)
switch v := i.(type) {
case int:
case string:
}
構文一覧
| 構文 | 概要 |
|---|---|
| switch 式 { case ... } | 式の値と一致するcaseを実行します。一致するcaseがなければdefaultが実行されます。 |
| case 値1, 値2: | カンマ区切りで複数の値を1つのcaseにまとめられます。 |
| default: | どのcaseにも一致しない場合に実行されます。省略可能です。 |
| fallthrough | 次のcaseの処理も続けて実行します。case末尾にのみ記述できます。 |
| switch { case 条件式: } | 式のない形式です。各caseに条件式を書けるためif-else ifの代替として使えます。 |
| switch v := i.(type) | 型スイッチです。インターフェース型の値の具体的な型に応じて分岐します。 |
サンプルコード
package main
import "fmt"
func dayType(day string) string {
switch day {
case "土曜日", "日曜日":
return "休日"
case "月曜日", "火曜日", "水曜日", "木曜日", "金曜日":
return "平日"
default:
return "不明"
}
}
func classify(score int) string {
// 条件式なしswitch(if-else if の代替)
switch {
case score >= 90:
return "優"
case score >= 70:
return "良"
case score >= 50:
return "可"
default:
return "不可"
}
}
func main() {
fmt.Println(dayType("土曜日")) // 休日
fmt.Println(dayType("月曜日")) // 平日
fmt.Println(classify(95)) // 優
fmt.Println(classify(60)) // 可
// fallthrough の例
n := 2
switch n {
case 1:
fmt.Println("1です")
case 2:
fmt.Println("2です")
fallthrough // 次のcaseも実行
case 3:
fmt.Println("2か3です")
}
// 型スイッチ
values := []interface{}{42, "hello", true, 3.14}
for _, v := range values {
switch t := v.(type) {
case int:
fmt.Printf("int: %d\n", t)
case string:
fmt.Printf("string: %s\n", t)
default:
fmt.Printf("その他: %v\n", t)
}
}
}
概要
Goのswitch文は自動的にbreakされるため、C言語のようにbreak忘れによるバグが起きません。次のcaseも続けて実行したい場合にのみ『fallthrough』を明示します。
『fallthrough』は条件に関係なく次のcaseの処理を実行します。次のcaseの条件が一致するかどうかに関係なく実行される点に注意してください。
型スイッチは型アサーションと組み合わせた強力な機能です。インターフェースを受け取る関数で型ごとの処理を分岐する際によく使われます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。