[ FOR — ЕДИНСТВЕННЫЙ ЦИКЛ ]
В Go нет while, нет do-while, нет foreach — только for в трёх формах. Философия Go: меньше концепций, меньше путаницы, чище код.
Три слова убрано из языка, одно осталось. Go ценит простоту — одним ключевым словом
for выражаются все виды повторения.
[ ФОРМА 1: КЛАССИЧЕСКИЙ FOR ]
Классическая форма с инициализатором, условием и постшагом — как в C и большинстве других языков. Инициализатор выполняется один раз перед циклом, условие проверяется перед каждой итерацией, постшаг — после каждой итерации.
for i := 0; i < 5; i++ {
fmt.Println("Шаг:", i)
}
// Шаг: 0
// Шаг: 1
// Шаг: 2
// Шаг: 3
// Шаг: 4
[ ФОРМА 2: FOR КАК WHILE ]
Если убрать инициализатор и постшаг, for работает как while в других языках — цикл продолжается, пока условие истинно. Бесконечный цикл — это for без условия вообще.
// for как while
hp := 100
for hp > 0 {
fmt.Println("HP:", hp)
hp -= 25
}
fmt.Println("Игрок погиб")
// Бесконечный цикл
for {
// выход через break
input := readInput()
if input == "exit" {
break
}
}
[ ФОРМА 3: FOR RANGE ]
for range перебирает элементы коллекции: слайса, строки, map и других структур данных. Он возвращает индекс и значение каждого элемента.
// По слайсу (массиву)
scores := []int{100, 250, 80, 310}
for i, v := range scores {
fmt.Printf("Место %d: %d очков\n", i+1, v)
}
// По строке — возвращает руны (символы)
for i, ch := range "Go" {
fmt.Printf("Символ %d: %c\n", i, ch)
}
// Только значения (индекс не нужен — используем _)
for _, v := range scores {
fmt.Println(v)
}
Символ
_ (подчёркивание) говорит компилятору: "эта переменная мне не нужна". В Go нельзя объявить переменную и не использовать её — _ решает эту проблему.
[ BREAK И CONTINUE ]
break немедленно выходит из цикла, continue переходит к следующей итерации. Для вложенных циклов Go поддерживает метки — именованные break для выхода из внешнего цикла.
// continue — пропускаем нечётные числа
for i := 0; i < 10; i++ {
if i%2 != 0 {
continue
}
fmt.Println(i) // 0 2 4 6 8
}
// Метка для выхода из вложенного цикла
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i+j == 3 {
break outer // выходим из обоих циклов
}
fmt.Println(i, j)
}
}
[ ПОПРОБУЙ САМ ]
Выведи таблицу умножения числа 3 от 1 до 10.
Формат каждой строки: 3 × 1 = 3
Используй классический for со счётчиком и fmt.Printf.
[ ПОКАЗАТЬ РЕШЕНИЕ ]
package main
import "fmt"
func main() {
for i := 1; i <= 10; i++ {
fmt.Printf("3 × %d = %d\n", i, 3*i)
}
}