Опуская области применения циклов, рассмотрим их формы в языке Go. В программировании для циклов используют конструкции for
, while
, do — while
и другие. Создатели Go придерживаются правила «чем проще, тем лучше», поэтому для всех видов цикла в языке есть только одно ключевое слово — for
.
Бесконечный цикл
for {
// код, выполняемый внутри бесконечного цикла
}
Такой цикл чаще всего встречается в worker-паттерне: фрагмент кода должен выполняться до завершения процесса или потока, пока не будет прерван внешним событием.
Использовать фигурные скобки { }
для обозначения области видимости цикла обязательно.
Трёхкомпонентный цикл
// создаём переменную
v := 0
//
for i := 1; i < 10; i++ {
// наращиваем переменную
v++
}
// выводим результат на экран
fmt.Println(v)
Классическая форма цикла состоит из трёх компонентов:
i := 1
— инициализация (pre-действие): выполняется единожды при входе в scope цикла;i < 10
— основное условие: пока условиеtrue
, итерации будут продолжаться;i++
— post-действие: выполняется по завершении каждой итерации цикла.
Заполнять каждую компоненту необязательно — можно опускать.
Есть ещё два варианта бесконечного цикла, но в форме трёх компонент:
for ;; {}
for ; true; {}
Компоненты цикла могут принимать более комплексный вид:
for a, b := 5, 10; a < 10 && b < 20; a, b = a + 1, b + 2 {
// do stuff
}
Цикл с одним условием
В цикле for
можно указывать только одно условие. В этом случае необходимая начальная инициализация должна происходить перед циклом, а действия, влияющие на условие, — выполняться внутри цикла.
package main
import "fmt"
func main() {
// начальная инициализация
i := 0
for i < 5 {
// выводим результат на экран
fmt.Println(i)
// наращиваем переменную
i++
}
}
Такой цикл похож на трёхкомпонентный, но здесь оставлено только основное условие. В некоторых языках такие циклы описываются ключевым словом while
.
Цикл range
// создаём массив
array := [3]int{1, 2, 3}
// итерируемся
for arrayIndex, arrayValue := range array {
fmt.Printf("array[%d]: %d\n", arrayIndex, arrayValue)
}
Цикл range
используется для комплексных типов — слайса и мапы (map). Подробнее об этом цикле расскажем в следующей теме, посвящённой композитным типам.
Ключевые слова break и continue
Текущую итерацию цикла можно прервать ключевыми словами:
break
— выход из цикла;continue
— переход к следующей итерации цикла (вызов post-действия, если оно задано).
Для примера посчитаем сумму всех чётных чисел от 0 до заданного предела:
sum, limit := 0, 100
for i := 0; true; i++ {
if i % 2 != 0 {
continue // переход к следующему числу, так как i — нечётное
}
if sum + i > limit {
break // выход из цикла, так как сумма превысит заданный предел
}
sum += i
}
fmt.Println(sum)
Ключевые слова break
и continue
относятся к ближайшему по области видимости циклу.
Метки
В языке Go есть метки (labels), которые позволяют перемещаться к разным частям кода.
Метку можно указать для операторов:
break
;continue
;goto
(безусловный оператор перехода, позволяет перейти в любое место кода).
Приведём пример для break
:
outerLoopLabel:
for i := 0; i < 5; i++ {
for j := 0; j < 5; j++ {
fmt.Printf("[%d, %d]\n", i, j)
break outerLoopLabel
}
}
fmt.Println("End")
[0, 0]
End
Здесь break outerLoopLabel
прерывает выполнение внешнего цикла.
А вот пример для continue
:
outerLoopLabel:
for i := 0; i < 5; i++ {
for j := 0; j < 5; j++ {
fmt.Printf("[%d, %d]\n", i, j)
continue outerLoopLabel
}
}
fmt.Println("End")
[0, 0]
[1, 0]
[2, 0]
[3, 0]
[4, 0]
End
Здесь continue outerLoopLabel
вызывает переход к следующей итерации внешнего цикла. Если заменить continue outerLoopLabel
на break
, результат будет аналогичный.
Ключевые слова break
и continue
без указания метки относятся к текущей (ближайшей) области видимости кода.
Посмотрите, как можно вывести чётные числа в диапазоне [0:20] с указанием десятка.
group := 0
for i := 0; i < 20; i++ {
switch {
case i % 2 == 0:
if i % 10 == 0 {
group++
break // break относится к ближайшему switch
}
fmt.Printf("%02d: %d\n", group, i)
default:
}
}
01: 2
01: 4
01: 6
01: 8
02: 12
02: 14
02: 16
02: 18
Использование меток в Go, как и во многих других языках, — тема вечных споров. Считается, что метки делают код неочевидным, превращают в так называемый спагетти-код 😄
📂 Go | Последнее изменение: 15.08.2024 15:39