Урок 3 из 8 · 20 мин · обновлено
Условия и циклы: if, switch и for
Как программа выбирает действие через if и switch, почему в Go один цикл for и как он заменяет все остальные, что делают break и continue.
if: выбрать действие
Условие пишут после if без круглых скобок, а действие — обязательно в фигурных:
temperature := 15
if temperature >= 20 {
fmt.Println("Тепло")
} else if temperature >= 10 {
fmt.Println("Прохладно")
} else {
fmt.Println("Холодно")
}
Прохладно
Go проверяет условия сверху вниз и выполняет первую ветку, где условие верно. Остальные он уже не смотрит.
Для сравнения используют ==, !=, <, >, <=, >=. Условия соединяют через && («и») и || («или»), а ! переворачивает условие.
switch: много вариантов
Когда вариантов много, цепочку else if удобнее заменить на switch:
day := "сб"
switch day {
case "сб", "вс":
fmt.Println("Выходной")
case "пт":
fmt.Println("Почти выходной")
default:
fmt.Println("Рабочий день")
}
Выходной
caseперечисляет значения через запятую;defaultсрабатывает, если не подошёл ни один вариант;- после подходящей ветки
switchсам останавливается. В отличие от C и JavaScript,breakписать не нужно.
switch можно писать и без значения — тогда в каждом case стоит своё условие:
total := 2700
switch {
case total >= 5000:
fmt.Println("Доставка бесплатно")
case total >= 2000:
fmt.Println("Доставка 199 ₽")
default:
fmt.Println("Доставка 399 ₽")
}
Доставка 199 ₽
for: единственный цикл
В Go нет while и do while, только for. Зато у него три формы.
Со счётчиком — когда число повторов известно:
for i := 1; i <= 3; i++ {
fmt.Println("Шаг", i)
}
Шаг 1
Шаг 2
Шаг 3
В заголовке три части через точку с запятой: начальное значение, условие продолжения и действие после каждого шага. i++ увеличивает i на единицу.
С условием — когда число повторов заранее неизвестно:
balance := 1000
for balance >= 300 {
balance -= 300
fmt.Println("Осталось:", balance)
}
Осталось: 700
Осталось: 400
Осталось: 100
Запись balance -= 300 — сокращение от balance = balance - 300. Если написать просто for { } без условия, цикл будет бесконечным: так устроены, например, серверы, которые постоянно ждут запросы.
По диапазону — повторить действие N раз:
for i := range 3 {
fmt.Println(i)
}
0
1
2
break и continue
continueпропускает остаток текущего шага и переходит к следующему;breakсразу завершает цикл.
for i := 1; i <= 10; i++ {
if i%2 == 0 {
continue // чётные пропускаем
}
if i > 7 {
break // дальше не идём
}
fmt.Println(i)
}
1
3
5
7
Всё, что после //, — комментарий: Go его пропускает, а людям он объясняет код.
Попробуйте сами. Посчитайте сумму всех чисел от 1 до 100, которые делятся на 3 или на 5. Подсказка: «делится на 3» в коде — это i%3 == 0.
Решение
package main
import "fmt"
func main() {
sum := 0
for i := 1; i <= 100; i++ {
if i%3 == 0 || i%5 == 0 {
sum += i
}
}
fmt.Println(sum)
}
2418
Цикл перебирает все числа, а if с условием «или» (||) отбирает подходящие. Переменную sum объявили до цикла, чтобы она сохраняла значение между шагами.
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
Какая запись условия правильная в Go?
В Go условие пишут без круглых скобок, а действие всегда в фигурных скобках, даже если оно из одной строки.
-
day := "сб". В switch есть ветки case "сб", "вс" и case "пт". Сколько веток выполнится?
switch выполняет первую подходящую ветку и выходит. Одна ветка может перечислять несколько значений через запятую.
-
Как в Go записать цикл, который работает, пока верно условие (как while в других языках)?
В Go нет while: его роль играет for с одним условием. Цикл повторяется, пока условие верно.
-
Что выведет цикл for i := range 3 { fmt.Println(i) }?
range 3 даёт числа от 0 до 2 — ровно три повтора, счёт начинается с нуля.