Всем привет, друзья. Мы продолжаем эксперименты с языком Go, и в сегодняшней статье посмотрим на использование цикла for в Go.
Я пропущу вводно-теоретическую часть о том "что такое циклы?" в языках программирования, если это всё же интересно, можете прочитать вступление другой нашей статьи, посвящённой циклам в C++, либо обратиться к статье на Википедии, где приведены теоретические основы циклов.
Прежде, чем мы рассмотрим как использовать цикл for в языке Go, я отмечу его важную особенность - это, по сути, единственная форма цикла, которая есть в Go. Да-да, вы не ослышались - действительно, разработчики языка Go посчитали, что различные формы и структуры циклов можно реализовать с помощью одного ключевого слова for. Это значительно упрощает и ускоряет изучение языка и наглядно показывает, насколько изящна реализация циклов в Go.
Мы начнём со сниппета кода на Go, который впоследствии и разберём по частям. Напомню, что теперь у вас есть возможность запускать примеры из статей, если внизу есть ссылка на наш репозиторий и файл с примером. Так что вам не придётся набивать сниппет вручную, воспользуйтесь инструкцией внизу этой статьи.
Итак, сниппет на Go с типовыми сценариями цикла for:
package ain_for_loop
import (
"strconv"
"allineed.ru/x/examples/ain_common"
)
func RunSample() {
ain_common.PrintExampleTitle(
"Цикл for в языке Go",
"for loop in Go",
"https://allineed.ru/development/go-development/61-go-using-for-loop")
ain_common.PrintlnLocalized(
"1) Демонстрация \"традиционного\" цикла 'for':",
"1) Demo of \"traditional\" 'for' cycle:")
for i := 1; i <= 20; i++ {
ain_common.PrintlnLocalizedStringsWithTab(
ain_common.NewLocalizedStrings("значение счётчика: i = ", strconv.Itoa(i)),
ain_common.NewLocalizedStrings("counter value: i = ", strconv.Itoa(i)))
}
ain_common.PrintlnLocalized(
"2) Демонстрация цикла 'for', аналогичного циклу 'while':",
"2) Demo of 'for' cycle that is similar to 'while' loop:")
t := 1
for t <= 5 {
ain_common.PrintlnLocalizedStringsWithTab(
ain_common.NewLocalizedStrings("значение счётчика: t = ", strconv.Itoa(t)),
ain_common.NewLocalizedStrings("counter value: t = ", strconv.Itoa(t)))
t++
}
ain_common.PrintlnLocalized(
"3) Демонстрация цикла 'for' с использованием 'break' и 'continue':",
"3) Demo of 'for' cycle with 'break' and 'continue':")
for x, y := 0, 0; x <= 10 && y <= 30; x, y = x+1, y+2 {
if x < 3 || y < 3 {
continue
}
if x == 9 {
break
}
ain_common.PrintlnLocalizedStringsWithTab(
ain_common.NewLocalizedStrings("значение x = ", strconv.Itoa(x), "; значение y = ", strconv.Itoa(y)),
ain_common.NewLocalizedStrings("value of x is: ", strconv.Itoa(x), "; value of y is: ", strconv.Itoa(y)))
}
ain_common.PrintlnLocalized(
"4) Демонстрация цикла 'for' с условием выхода из цикла внутри самого цикла:",
"4) Demo of 'for' cycle with a condition of exiting from loop inside the cycle itself:")
v := 10
for {
v++
if v > 20 {
break
}
ain_common.PrintlnLocalizedStringsWithTab(
ain_common.NewLocalizedStrings("значение v = ", strconv.Itoa(v)),
ain_common.NewLocalizedStrings("value of v is: ", strconv.Itoa(v)))
}
}
Этот сниппет разбит на 4 блока:
- демонстрация "традиционного" цикла for, где есть начальная инициализация переменной-счётчика, условие выполнения цикла и оператор инкремента счётчика
- демонстрация организации цикла for по типу цикла while, который присутствует во многих других языках программирования.
- демонстрация операторов continue и break, которые продолжают итерацию по циклу или приводят к выходу из цикла, соответственно
- демонстрация организации цикла for без всяких входных условий, при которой условие выхода из цикла заключено внутрь самого цикла
Кратко разберём каждый из блоков в примере:
В первом блоке, без каких-либо круглых скобок (как это привычно для разработчиков на языках Java, C, C++, C# и ряда других) записываются три составные части "традиционного" цикла for: инициализация счётчика, условие выполнения цикла, оператор инкремента счётчика:
for i := 1; i <= 20; i++ {
ain_common.PrintlnLocalizedStringsWithTab(
ain_common.NewLocalizedStrings("значение счётчика: i = ", strconv.Itoa(i)),
ain_common.NewLocalizedStrings("counter value: i = ", strconv.Itoa(i)))
}
Внутри цикла с помощью нашего вспомогательного пакета ain_common (он будет встречаться во многих примерах) мы просто выводим на экран консоли текущее значение счётчика (или переменной цикла) с именем i.
Во втором блоке (аналоге цикла while в других языках программирования) мы инициализируем переменную цикла с именем t до входа в цикл. Внутри цикла мы также просто выводим значение счётчика на экран консоли, после чего не забываем вручную инкрементировать значение счётчика:
t := 1
for t <= 5 {
ain_common.PrintlnLocalizedStringsWithTab(
ain_common.NewLocalizedStrings("значение счётчика: t = ", strconv.Itoa(t)),
ain_common.NewLocalizedStrings("counter value: t = ", strconv.Itoa(t)))
t++
}
Если мы не напишем инструкцию t++ (или t = t + 1, что равносильно инкременту), то наш цикл превратится в бесконечный, а программа просто зависнет!
В третьем блоке мы немного усложняем вариант из первого блока - добавляем в цикл две переменные-счётчика с именами x и y, а внутри самого цикла используем специальные конструкции continue и break. Ключевое слово continue позволяет пропустить все остальные операторы в цикле и перейти сразу к следующей итерации, а ключевое слово break заставляет цикл прерваться "досрочно" - до того момента, когда переменные-счётчики достигнут своих предельных значений, записанных в условии цикла:
for x, y := 0, 0; x <= 10 && y <= 30; x, y = x+1, y+2 {
if x < 3 || y < 3 {
continue
}
if x == 9 {
break
}
ain_common.PrintlnLocalizedStringsWithTab(
ain_common.NewLocalizedStrings("значение x = ", strconv.Itoa(x), "; значение y = ", strconv.Itoa(y)),
ain_common.NewLocalizedStrings("value of x is: ", strconv.Itoa(x), "; value of y is: ", strconv.Itoa(y)))
}
Наконец, в четвёртом блоке мы "проваливаемся" в цикл for без каких-либо предусловий, а значение счётчика v, равным 10, задаём вручную до входа в цикл:
v := 10
for {
v++
if v > 20 {
break
}
ain_common.PrintlnLocalizedStringsWithTab(
ain_common.NewLocalizedStrings("значение v = ", strconv.Itoa(v)),
ain_common.NewLocalizedStrings("value of v is: ", strconv.Itoa(v)))
}
Обратите внимание, что как и во втором блоке, мы должны вручную инкрементировать значение v внутри цикла, а также мы должны сами, вручную, определить условие выхода из цикла, во избежание бесконечного зацикливания. В нашем случае мы это делаем с помощью оператора if, проверяя, что если значение v стало больше 20, то нужно исполнить оператор break, который прервёт наш цикл и выйдет из него.
Ну, вот и всё, это основные типовые конструкции, которые пригодятся вам для написания циклов в ваших программах на языке Go. Попробуйте запустить пример в среде Visual Studio Code, и вы увидите в вашей консоли следующее:
Starting: C:\Users\1\go\bin\dlv.exe dap --check-go-version=false --listen=127.0.0.1:4060 from c:\DEVELOPMENT\Go\GoExamples\GoExamples
DAP server listening at: 127.0.0.1:4060
---------------------------------------------------------------------
>>> [RU] Запуск примера из статьи с сайта allineed.ru: "Цикл for в языке Go"
>>> [RU] Ссылка на статью: https://allineed.ru/development/go-development/61-go-using-for-loop
---------------------------------------------------------------------
1) Демонстрация "традиционного" цикла 'for':
значение счётчика: i = 1
значение счётчика: i = 2
значение счётчика: i = 3
значение счётчика: i = 4
значение счётчика: i = 5
значение счётчика: i = 6
значение счётчика: i = 7
значение счётчика: i = 8
значение счётчика: i = 9
значение счётчика: i = 10
значение счётчика: i = 11
значение счётчика: i = 12
значение счётчика: i = 13
значение счётчика: i = 14
значение счётчика: i = 15
значение счётчика: i = 16
значение счётчика: i = 17
значение счётчика: i = 18
значение счётчика: i = 19
значение счётчика: i = 20
2) Демонстрация цикла 'for', аналогичного циклу 'while':
значение счётчика: t = 1
значение счётчика: t = 2
значение счётчика: t = 3
значение счётчика: t = 4
значение счётчика: t = 5
3) Демонстрация цикла 'for' с использованием 'break' и 'continue':
значение x = 3; значение y = 6
значение x = 4; значение y = 8
значение x = 5; значение y = 10
значение x = 6; значение y = 12
значение x = 7; значение y = 14
значение x = 8; значение y = 16
4) Демонстрация цикла 'for' с условием выхода из цикла внутри самого цикла:
значение v = 11
значение v = 12
значение v = 13
значение v = 14
значение v = 15
значение v = 16
значение v = 17
значение v = 18
значение v = 19
значение v = 20
Process 18112 has exited with status 0
dlv dap (9824) exited with code: 0
Примеры из этой статьи: https://github.com/AllineedRu/GoExamples/blob/main/ain_for_loop/sample.go