Изучай программирование в играх

₊⊹

ЦИКЛЫ

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

Go Средний

[ FOR — ЕДИНСТВЕННЫЙ ЦИКЛ ]

В Go нет while, нет do-while, нет foreach — только for в трёх формах. Философия Go: меньше концепций, меньше путаницы, чище код.

₊⊹
Три формы одного ключевого слова:
Три слова убрано из языка, одно осталось. Go ценит простоту — одним ключевым словом for выражаются все виды повторения.

[ ФОРМА 1: КЛАССИЧЕСКИЙ FOR ]

Классическая форма с инициализатором, условием и постшагом — как в C и большинстве других языков. Инициализатор выполняется один раз перед циклом, условие проверяется перед каждой итерацией, постшаг — после каждой итерации.

GO
for i := 0; i < 5; i++ {
    fmt.Println("Шаг:", i)
}
// Шаг: 0
// Шаг: 1
// Шаг: 2
// Шаг: 3
// Шаг: 4

[ ФОРМА 2: FOR КАК WHILE ]

Если убрать инициализатор и постшаг, for работает как while в других языках — цикл продолжается, пока условие истинно. Бесконечный цикл — это for без условия вообще.

GO
// 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 и других структур данных. Он возвращает индекс и значение каждого элемента.

GO
// По слайсу (массиву)
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 для выхода из внешнего цикла.

GO
// 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)
    }
}
◄ УСЛОВИЯ ФУНКЦИИ ►