Управление потоком
Управление потоком в 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.