Управление потоком

Управление потоком в Go: if с инициализацией, единственный цикл for и мощный switch.

В Go один-единственный цикл — for. Он же заменяет while, do-while и бесконечный цикл.

if и его особенности

Условие в if пишется без скобок, а тело — обязательно в фигурных. Удобная деталь: в if можно объявить переменную прямо в условии — она будет видна в ветках if/else. Это идеально для проверки ошибок.

package main

import (
    "fmt"
    "strconv"
)

func main() {
    if n, err := strconv.Atoi("100"); err == nil {
        fmt.Println("число:", n)
    } else {
        fmt.Println("ошибка разбора")
    }
}

Вывод:

число: 100

for — единственный цикл

У for три формы. Классическая — со счётчиком. Форма с одним условием работает как while. Без условия вообще — бесконечный цикл (выход через break).

package main

import "fmt"

func main() {
    // классический for
    sum := 0
    for i := 1; i <= 5; i++ {
        sum += i
    }
    fmt.Println("сумма:", sum)

    // for как while
    n := 8
    for n > 1 {
        n /= 2
    }
    fmt.Println("n:", n)
}

Вывод:

сумма: 15
n: 1

for range: перебор коллекций

Форма for range перебирает срезы, массивы, map, строки и каналы. Она возвращает индекс и значение.

package main

import "fmt"

func main() {
    fruits := []string{"яблоко", "груша", "слива"}
    for i, fruit := range fruits {
        fmt.Println(i, fruit)
    }
}

Вывод:

0 яблоко
1 груша
2 слива

switch: чище, чем цепочка if

switch в Go умнее, чем в C: после каждого case не нужен break — провала вниз по умолчанию нет. Зато можно писать switch вообще без выражения — как красивую замену длинной цепочке if-else if.

package main

import "fmt"

func grade(score int) string {
    switch {
    case score >= 90:
        return "отлично"
    case score >= 70:
        return "хорошо"
    default:
        return "нужно подтянуть"
    }
}

func main() {
    fmt.Println(grade(95))
    fmt.Println(grade(72))
    fmt.Println(grade(40))
}

Вывод:

отлично
хорошо
нужно подтянуть

Один case может перечислять несколько значений через запятую: case "a", "b":. А если провал вниз всё-таки нужен — есть явное слово fallthrough.

Итог

  • if без скобок умеет объявлять переменную в условии — удобно для проверки ошибок.
  • for — единственный цикл: со счётчиком, как while, бесконечный и for range.
  • switch не проваливается вниз; форма без выражения заменяет цепочку if-else.
Проверьте себя
1. Какие циклы есть в Go?
Afor, while и do-while
Bтолько while
Cтолько for (во всех формах)
Dfor и foreach
2. Нужен ли break в конце каждого case в switch?
AДа, обязательно
BНет, провала вниз по умолчанию нет
CТолько в последнем case
Dbreak запрещён в switch
3. Что возвращает for range по срезу?
AТолько значение
BТолько индекс
CИндекс и значение
DДлину среза
Поддержать проект