Циклический перебор данных с помощью выражений for
Еще одним распространенным потоком управления является цикл. Go использует только одну циклическую конструкцию, которой является цикл for
. Однако циклы можно представить более чем одним способом. В этой части вы узнаете, какие шаблоны циклов поддерживаются в Go.
Базовый синтаксис цикла for
Подобно операторам if
и switch
, выражения цикла for
не нуждаются в круглых скобках. Однако фигурные скобки указывать обязательно.
Точки с запятой (;
) разделяют три компонента циклов for
:
- Начальный оператор, который выполняется перед первой итерацией (необязательно).
- Выражение условия, которое вычисляется перед каждой итерацией. Когда это условие равно
false
, цикл останавливается. - Конечный оператор, который выполняется в конце каждой итерации (необязательно).
Как мы видим, цикл for
в Go похож на цикл for
в таких языках программирования, как C, Java и C#.
В простейшей форме цикл for
в Go выглядит следующим образом:
func main() {
sum := 0
for i := 1; i <= 100; i++ {
sum += i
}
fmt.Println("sum of 1..100 is", sum)
}
Давайте рассмотрим другие варианты написания циклов в Go.
Пустые начальные и конечные операторы
В некоторых языках программирования ключевое слово while
можно использовать для написания шаблонов циклов, где необходимо только выражение условия. В языке Go ключевого слова while
нет. Но вы можете использовать цикл вместо этого и воспользоваться тем фактом for
, что Go делает предварительные данные и постстаты необязательными.
Используйте приведенный ниже фрагмент кода, чтобы убедиться в возможности применить цикл for
, не используя начальные и конечные операторы.
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
var num int64
rand.Seed(time.Now().Unix())
for num != 5 {
num = rand.Int63n(15)
fmt.Println(num)
}
}
Если переменная num
содержит значение, отличное от 5
, программа выводит случайное число.
Бесконечные циклы и операторы break
Еще одним шаблоном цикла, который можно записать в Go, является бесконечный цикл. В этом случае вам не понадобится писать выражение условия или начальный или конечный оператор. Вместо этого путь будет считываться с цикла. Если этого не сделать, логика никогда не выйдет из цикла. Чтобы логика могла выйти из цикла, используйте ключевое слово break
.
Чтобы написать правильный бесконечный цикл, добавьте к ключевому слову for
фигурные скобки, как показано ниже:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
var num int32
sec := time.Now().Unix()
rand.Seed(sec)
for {
fmt.Print("Writing inside the loop...")
if num = rand.Int31n(10); num == 5 {
fmt.Println("finish!")
break
}
fmt.Println(num)
}
}
При каждом выполнении этого кода вы будете получать другие выходные данные.
Операторы continue
В Go для пропуска текущей итерации цикла можно использовать ключевое слово continue
. Это ключевое слово можно использовать, например, чтобы выполнять проверку перед продолжением цикла. Или, когда при написании бесконечного цикла необходимо ждать, пока ресурс не станет доступным.
В этом примере используется ключевое слово continue
:
package main
import "fmt"
func main() {
sum := 0
for num := 1; num <= 100; num++ {
if num%5 == 0 {
continue
}
sum += num
}
fmt.Println("The sum of 1 to 100, but excluding numbers divisible by 5, is", sum)
}
Этот пример содержит цикл for, который выполняет итерацию от 1 до 100, добавляя во время каждой итерации к сумме текущее число. Каждое число, кратное 5, пропускается в текущей итерации цикла и не добавляется к сумме.