メインコンテンツにスキップ
モジュール 2 · レッスン 4 / 5コース内の 9/50~10 min
モジュールのレッスン (4/5)

慣用的なスイッチ

Go の switch は、C/Java のものよりも人間工学に基づいています。各 case には、 独自の暗黙的ブロック (break を書き込む必要はありません)、グループ化できます カンマを含む複数の値、および式のない switch は動作します より読みやすい if/else if チェーンのようなものです。

値をオンにします

Go
giorno := "mar"
switch giorno {
case "lun", "mar", "mer", "gio", "ven":
    fmt.Println("feriale")
case "sab", "dom":
    fmt.Println("weekend")
default:
    fmt.Println("sconosciuto")
}

case はカンマで区切られた複数の値を受け入れます。暗黙的な値はありません。 fallthrough: ケースが実行されるとすぐに、スイッチは終了します。

無条件で切り替える

式を省略した場合、スイッチは true を評価し、各 case は bool 状態。これは、長い if/else if チェーンの慣用的な代替手段です。

Go
switch {
case x < 0:
    fmt.Println("negativo")
case x == 0:
    fmt.Println("zero")
case x < 10:
    fmt.Println("piccolo")
default:
    fmt.Println("grande")
}

初期化ステートメント

if と同様に、switch も init ステートメントを受け入れます。

Go
switch n := len(s); {
case n == 0:
    fmt.Println("vuoto")
case n > 100:
    fmt.Println("lungo")
default:
    fmt.Println("ok")
}

n はスイッチ内にのみ存在します。

明示的な fallthrough

本当に実行を次のケースに分類したい場合は、次のように記述する必要があります。

Go
switch 1 {
case 1:
    fmt.Println("uno")
    fallthrough
case 2:
    fmt.Println("due")  // anche questo viene stampato
case 3:
    fmt.Println("tre")  // questo no
}

タイプスイッチ (プレビュー)

インターフェースの動的タイプに基づいて区別できます。 値。これについては、「インターフェイス」モジュールで詳しく説明します。

Go
var i interface{} = "ciao"
switch v := i.(type) {
case int:
    fmt.Println("int:", v)
case string:
    fmt.Println("string:", v)
default:
    fmt.Printf("tipo %T\n", v)
}

試してみてください

運動#go.m2.l4.e1
試行回数: 0読み込み中…

g の値のスイッチを使用して、lun/mar/mer/gio/ven の場合は 'feriale'、それ以外の場合は 'weekend' を出力します。

エディターを読み込み中…
ヒントを表示

5 つの平日をカンマで区切って 1 つのケースにグループ化します。

3 回の試行後に解決策が利用可能になります

運動#go.m2.l4.e2
試行回数: 0読み込み中…

条件なしでスイッチを使用すると、x に応じて 'neg'、'zero'、または 'pos' が出力されます。

エディターを読み込み中…
ヒントを表示

「switch」の後には式はなく、「{」だけです。

3 回の試行後に解決策が利用可能になります

Quiz#go.m2.l4.e3
準備完了

このプログラムは何を出力しますか?

Go
switch 1 {
case 1:
    fmt.Print("a")
case 2:
    fmt.Print("b")
}
回答の選択肢

要約

  • case は、カンマで区切られた複数の値を受け入れます。
  • 暗黙的なフォールスルーなし: 各ケースには独自の暗黙的な break があります。
  • 式のない switch { ... } = より読みやすい if/else if チェーン。
  • Init ステートメント: switch x := f(); { ... }、スコープはブロックに限定されます。
  • fallthrough は存在しますが、まれです。条件を評価せずに次のケースに入ります。
  • 動的タイプに基づいて区別するには、スイッチ v := i.(type) を入力します (インターフェイス モジュール)。