Оператор switch
имеет две разные формы. В первой он содержит вычисляемое выражение, тогда как во второй не имеет выражения для вычисления. В этом случае выражения вычисляются в каждом операторе case, что повышает гибкость switch. Основное преимущество switch заключается в том, что при правильном использовании он упрощает сложные и трудночитаемые блоки if-else.
// с выражением после switch switch argument { case "0": fmt.Println("Zero!") case "1": fmt.Println("One!") case "2", "3", "4": fmt.Println("2 or 3 or 4") fallthrough default: fmt.Println("Value:", argument) }Здесь мы видим блок switch с четырьмя ветвлениями. Первые три требуют точного совпадения string, а последнее соответствует всему остальному. Порядок операторов case важен, поскольку выполняется только первое совпадение. Ключевое слово fallthrough сообщает Go, что после выполнения этой ветки необходимо перейти на следующую, которая в данном случае является веткой default
Следующий код показывает вторую форму switch, где условие вычисляется в каждой ветви case:
value, err := strconv.Atoi(argument) if err != nil { fmt.Println("Cannot convert to int:", argument) return } // Без выражения после switch switch { case value == 0: fmt.Println("Zero!") case value > 0: fmt.Println("Positive integer") case value < 0: fmt.Println("Negative integer") default: fmt.Println("This should not happen:", value) }