В языке Go существует только один цикл — for
, но он может использоваться в разных формах, заменяя собой традиционные while
, do-while
и foreach
из других языков. Разберем все варианты.
for i := 0; i < 5; i++ {
fmt.Println(i) // Выведет 0, 1, 2, 3, 4
}
Состоит из трех частей:
i := 0
(выполняется один раз)i < 5
(проверяется перед каждой итерацией)i++
(выполняется после каждой итерации)В Go нет отдельного ключевого слова while
. Вместо этого используется for
с одним условием:
count := 0
for count < 3 { // Аналог while(count < 3)
fmt.Println(count)
count++
}
// Вывод: 0, 1, 2
for {
fmt.Println("Бесконечный цикл")
break // Чтобы не зависнуть
}
Используется в серверах, обработчиках событий и т.д.
Важно: Всегда должен иметь условие выхода (break
, return
или os.Exit
).
// По массиву/срезу
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
В 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
для контроля, а "бесконечный" вариант для долгоживущих процессов.