Какие циклы есть в Go?go-37

В языке Go существует только один цикл — for, но он может использоваться в разных формах, заменяя собой традиционные while, do-while и foreach из других языков. Разберем все варианты.

1. Классический цикл for

for i := 0; i < 5; i++ {
    fmt.Println(i) // Выведет 0, 1, 2, 3, 4
}

Состоит из трех частей:

  • Инициализация: i := 0 (выполняется один раз)
  • Условие: i < 5 (проверяется перед каждой итерацией)
  • Пост-операция: i++ (выполняется после каждой итерации)

2. Цикл while

В Go нет отдельного ключевого слова while. Вместо этого используется for с одним условием:

count := 0
for count < 3 { // Аналог while(count < 3)
    fmt.Println(count)
    count++
}
// Вывод: 0, 1, 2

3. Бесконечный цикл

for {
    fmt.Println("Бесконечный цикл")
    break // Чтобы не зависнуть
}

Используется в серверах, обработчиках событий и т.д.
Важно: Всегда должен иметь условие выхода (break, return или os.Exit).

4. Цикл по коллекциям

// По массиву/срезу
nums := []int{10, 20, 30}
for index, value := range nums {
    fmt.Printf("Индекс: %d, Значение: %d\n", index, value)
}

// По мапе
colors := map[string]string{"red": "#FF0000", "green": "#00FF00"}
for key, hex := range colors {
    fmt.Printf("%s -> %s\n", key, hex)
}

// По строке (руны)
for i, r := range "Привет" {
    fmt.Printf("Позиция: %d, Символ: %c\n", i, r)
}

Особенности:

  • Для индекса без значения используйте for idx := range slice
  • Для значений без индекса — for _, val := range slice

5. do-while

В Go нет do-while, но его можно имитировать:

i := 0
for {
    fmt.Println(i) // Тело цикла выполнится минимум 1 раз
    i++
    if i >= 3 { // Условие выхода
        break
    }
}

Управление циклами

  • break — немедленный выход
  • continue — переход к следующей итерации
  • Метки для вложенных циклов:
outer:
for i := 0; i < 3; i++ {
    for j := 0; j < 3; j++ {
        if i*j == 4 {
            break outer // Выход из обоих циклов
        }
    }
}

Производительность

  • range по срезу/массиву оптимизирован и быстр
  • range по мапе — случайный порядок элементов
  • Классический for часто быстрее range в CPU-bound задачах

Резюмируем

В Go есть только for, но его гибкость покрывает все сценарии: от классических циклов до итераций по коллекциям. Выбор формы зависит от контекста — range для безопасности, классический for для контроля, а "бесконечный" вариант для долгоживущих процессов.