Операторы ветвления switch-case в Go (Golang)

GolangGolangBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В предыдущей лабораторной работе (lab) мы изучили использование условных операторов 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{{"Операторы ветвления switch-case в Go (Golang)"}} go/if_else -.-> lab-149072{{"Операторы ветвления switch-case в Go (Golang)"}} go/switch -.-> lab-149072{{"Операторы ветвления switch-case в Go (Golang)"}} go/time -.-> lab-149072{{"Операторы ветвления switch-case в Go (Golang)"}} end

Базовый синтаксис

Синтаксис оператора ветвления switch похож на синтаксис оператора ветвления if, так как оба имеют условные проверки. Базовый синтаксис выглядит следующим образом:

switch condition {
    case val1:
        // code block
    case val2:
        // code block
   ...
    default:
        // code block
}

Условие может быть выражением любого типа. Когда условие совпадает со значением определенного оператора case, будет выполнен соответствующий оператор case, а затем программа выйдет из текущего оператора ветвления switch.

Значения в операторах case должны быть того же типа, что и выражение условия.

Программа будет оценивать операторы case сверху вниз и выполнять первый совпадающий оператор case. После завершения выполнения она выйдет из текущего оператора ветвления switch.

Оператор default похож на оператор else. Когда ни один из других операторов case не совпадает с условием, будет выполнен оператор default.

Давайте рассмотрим пример прогноза погоды. Создайте новый файл с именем switch.go и напишите следующий код:

cd ~/project
touch switch.go
package main

import (
    "fmt"
)

func main() {
    // Today's weather
    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.🌂

Этот прогноз погоды будет выводить разные результаты в зависимости от погодных условий. Сначала мы установили сегодняшнюю погоду как "дождливая". В операторе ветвления switch-case ниже мы установили три разных условия. Когда идет снег, мы напоминаем вам надеть шарф, когда идет дождь, мы напоминаем вам взять зонтик, а в противном случае мы считаем, что сегодня солнечно.

Несколько значений в ветви

Оператор case также может иметь несколько значений, как показано ниже:

switch condition {
    case val1, val2:
        // code block
  ...
}

Мы обновили программу прогноза погоды следующим образом:

package main

import (
    "fmt"
)

func main() {
    // Today's weather
    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.
  • 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 выводит 10 после того, как оператор case 10 совпал, а затем выводит следующий оператор case после fallthrough.

Инициализирующее выражение в операторе 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 также имеет инициализирующее выражение, разделенное точкой с запятой от условного выражения.