Цикл for в языке Go

User Rating: 0 / 5

Всем привет, друзья. Мы продолжаем эксперименты с языком 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 блока:

  1. демонстрация "традиционного" цикла for, где есть начальная инициализация переменной-счётчика, условие выполнения цикла и оператор инкремента счётчика
  2. демонстрация организации цикла for по типу цикла while, который присутствует во многих других языках программирования.
  3. демонстрация операторов continue и break, которые продолжают итерацию по циклу или приводят к выходу из цикла, соответственно
  4. демонстрация организации цикла 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 

 

Яндекс.Метрика