Урок 3 из 8 · 20 мин · обновлено

Условия и циклы: if, switch и for

Как программа выбирает действие через if и switch, почему в Go один цикл for и как он заменяет все остальные, что делают break и continue.

if: выбрать действие

Условие пишут после if без круглых скобок, а действие — обязательно в фигурных:

Go
temperature := 15
if temperature >= 20 {
	fmt.Println("Тепло")
} else if temperature >= 10 {
	fmt.Println("Прохладно")
} else {
	fmt.Println("Холодно")
}
Результат
Прохладно

Go проверяет условия сверху вниз и выполняет первую ветку, где условие верно. Остальные он уже не смотрит.

Для сравнения используют ==, !=, <, >, <=, >=. Условия соединяют через && («и») и || («или»), а ! переворачивает условие.

switch: много вариантов

Когда вариантов много, цепочку else if удобнее заменить на switch:

Go
day := "сб"
switch day {
case "сб", "вс":
	fmt.Println("Выходной")
case "пт":
	fmt.Println("Почти выходной")
default:
	fmt.Println("Рабочий день")
}
Результат
Выходной
  • case перечисляет значения через запятую;
  • default срабатывает, если не подошёл ни один вариант;
  • после подходящей ветки switch сам останавливается. В отличие от C и JavaScript, break писать не нужно.

switch можно писать и без значения — тогда в каждом case стоит своё условие:

Go
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. Зато у него три формы.

Со счётчиком — когда число повторов известно:

Go
for i := 1; i <= 3; i++ {
	fmt.Println("Шаг", i)
}
Результат
Шаг 1
Шаг 2
Шаг 3

В заголовке три части через точку с запятой: начальное значение, условие продолжения и действие после каждого шага. i++ увеличивает i на единицу.

С условием — когда число повторов заранее неизвестно:

Go
balance := 1000
for balance >= 300 {
	balance -= 300
	fmt.Println("Осталось:", balance)
}
Результат
Осталось: 700
Осталось: 400
Осталось: 100

Запись balance -= 300 — сокращение от balance = balance - 300. Если написать просто for { } без условия, цикл будет бесконечным: так устроены, например, серверы, которые постоянно ждут запросы.

По диапазону — повторить действие N раз:

Go
for i := range 3 {
	fmt.Println(i)
}
Результат
0
1
2

break и continue

  • continue пропускает остаток текущего шага и переходит к следующему;
  • break сразу завершает цикл.
Go
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.

Решение
Go
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 объявили до цикла, чтобы она сохраняла значение между шагами.

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Какая запись условия правильная в Go?

  2. day := "сб". В switch есть ветки case "сб", "вс" и case "пт". Сколько веток выполнится?

  3. Как в Go записать цикл, который работает, пока верно условие (как while в других языках)?

  4. Что выведет цикл for i := range 3 { fmt.Println(i) }?