Предыдущая часть — Управляющие конструкции – операторы if/else/switch/select.
У разработчика может возникнуть необходимость выполнения одного кода несколько раз.
В таком случае в программировании применяются циклы, ход выполнения которых выглядит так:
В Go имеется цикл типа for
и вложенные циклы:
Sr.No | Loop Type & Description |
---|---|
1 | |
2 |
Содержание
Цикл for
Ситаксис:
for [condition | ( init; condition; increment ) | Range] { statement(s); }
Выполнение цикла происходит в следующем порядке:
- если условие (condition) указано — цикл будет выполняться, пока условие истинно (true)
- если в цикле указывается (ициниализатор; условие; инкремент) (
( init; condition; increment )
) — тогда:- выполняется init, только один раз, при вхождении в цикл — тут вы можете объявиться и инициализировать управляющие циклом переменные
- следующим выполняется вычисление условия (condition), и если оно true — то цикл выполняется. Если false — тело цикла пропускается, и выполнение переходит к следующему после for выражению
- если условие было true, то после выполнения тела цикла управление переходит к началу цикла и к его оператору increment, который позволяет выполнить обновление управляющией переменной цикла
- далее снова проверяется условие, и если оно всё ещё true, после обновления значения переменной, то цикл повторяется, а если условие становится false — то выполнение цикла прерывается, и управлеине переходит к следующему за
for
оператору
- если в условии цикла используется
range
— то цикл будет выполнен для каждого элемента массива
Пример:
package main import "fmt" func main() { // init int b b := 15 // declare int a var a int // range array numbers := [6]int{1, 2, 3, 5} /* for loop execution init here: a := 0; condition here: a < 10; increment here: a++ */ for a := 0; a < 10; a++ { fmt.Printf("value of a: %d\n", a) } // only condition loop for a < b { a++ fmt.Printf("value of a: %d\n", a) } // range loop for i, x:= range numbers { fmt.Printf("value of x = %d at %d\n", x, i) } }
Результат:
Вложенные циклы
Go позволяет использовать циклы внутри циклов — вложенные циклы (nested loop).
Синтаксис:
for [condition | ( init; condition; increment ) | Range] { for [condition | ( init; condition; increment ) | Range] { statement(s); } statement(s); }
Пример:
package main import "fmt" func main() { /* local variable definition */ var i, j int for i = 2; i < 100; i++ { for j = 2; j <= (i/j); j++ { if(i%j==0) { break; // if factor found, not prime } } if(j > (i/j)) { } } }
Результат:
Операторы контроля циклов
Операторы контроля выполнения цикла могут менять процесс выполнения цикла, и изменять его нормальную последовательность выполнения.
Список таких операторов:
Sr.No | Control Statement & Description |
---|---|
1 | |
2 | |
3 | It transfers control to the labeled statement. |
Оператор break
Оператор break
используется для:
- когда выполнение цикла встречает оператор
break
— выполнение прерывается, и поток управления переходит к следующему за циклом коду - так же может использоваться для прерывания выполнения оператора
switch
При использовании break
во вложенном цикле — он прервёт выполнение текущего цикла, и передаст управление внешнему циклу.
Синтаксис:
break;
Пример:
package main import "fmt" func main() { /* local variable definition */ var a int = 10 /* for loop execution */ for a < 20 { fmt.Printf("value of a: %d\n", a); a++; if a > 15 { /* once a greater then 15 - immediately terminate the loop using break statement */ break; } } }
Результат:
Оператор continue
Оператор continue
в Go работает аналогично break
, но наоборот: вместо прерывания цикла он указывает на необходимость выполнить новую итерацию цикла, пропуская код после continue
.
Синтаксис:
continue;
Пример:
package main import "fmt" func main() { for b := 0; b < 10; b++ { fmt.Printf("b = %d\n", b) if b == 5 { fmt.Printf("b = %d, so will skip to the begin\n", b) continue; fmt.Printf("this never will be printed") } fmt.Printf("rest of the loop's body\n") } }
Результат:
Оператор goto
Оператор goto
в Go позволяет выполнить переключение контекста выполнения внутри одной фукнции к указанном оператору.
Учтите, что использование goto
не поощряется, так как приводит к запутанности кода.
Синтаксис:
goto label; .. . label: statement;
Пример:
package main import "fmt" func main() { /* local variable definition */ var a int = 10 LOOP: fmt.Printf("GOTO here\n") /* do loop execution */ for a < 20 { if a == 15 { /* skip the iteration */ a = a + 1 goto LOOP } fmt.Printf("value of a: %d\n", a) a++ } }
Результат:
Бесконечный цикл
Цикл становится бесконечным (infinite loop), если условие всегда true.
Дл создания такого цикла — достаточно не указывать никаких условий:
package main import "fmt" func main() { for true { fmt.Printf("This loop will run forever.\n"); } }
Результат:
Продолжение — часть 9 — функции.