В языке 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 slicefor _, 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 для контроля, а "бесконечный" вариант для долгоживущих процессов.