Logo
Книга для начинающих
ВходРегистрация
/
Программирование
/
Курс Golang
/

Цикл For

Golang: Цикл For

В Go есть только одна конструкция для организации циклов — for. Она заменяет собой и while, и do while из других языков. С её помощью можно реализовать любые виды повторений.

Классический цикл со счётчиком

Наиболее распространённый способ перебора:

for i := 0; i < 5; i++ {
	fmt.Println(i)
}
// 0
// 1
// 2
// 3
// 4

Здесь:

  • i := 0 — инициализация переменной.
  • i < 5 — условие выполнения.
  • i++ — шаг итерации.

Цикл с только условием

Такой for работает как while в других языках:

i := 0
for i < 5 {
	fmt.Println(i)
	i++
}

// 0
// 1
// 2
// 3
// 4

Бесконечный цикл

for {
	fmt.Println("Hello, Hexlet")
}

// Hello, Hexlet
// Hello, Hexlet
// Hello, Hexlet
// Hello, Hexlet
// Hello, Hexlet
// Hello, Hexlet
// Hello, Hexlet
// ...
// Hello, Hexlet

Обычно используется с break или return внутри тела, чтобы остановить выполнение.

Повторение действий с помощью range

В Go существует альтернативный вариант цикла для задачи повторения какого-то действия n раз. Вместо привычного счётчика i := 0; i < n; i++, можно использовать конструкцию for range.

for range 3 {
	fmt.Println("Hello!")
}

// Hello!
// Hello!
// Hello!

Если понадобится использовать номер итерации, вы можете явно объявить переменную:

for i := range 5 {
	fmt.Println("Итерация номер", i)
}

// Итерация номер 0
// Итерация номер 1
// Итерация номер 2
// Итерация номер 3
// Итерация номер 4

Такой цикл начинается с 0 и заканчивается на n - 1 — как в обычном счётчике.

Перебор строки посимвольно

Цикл for ... range позволяет пройтись по строке символ за символом. Внутри цикла доступны:

  • Индекс символа.
  • Сам символ в виде rune (Unicode).
text := "go"

for i, r := range text {
	fmt.Printf("Индекс: %d, Символ: %c\n", i, r)
}

// Индекс: 0, Символ: g
// Индекс: 1, Символ: o

Что делает range?

  • Возвращает индекс текущего элемента (в байтах).
  • Возвращает символ в виде rune — это Unicode-код символа.

Строка в Go — это последовательность байт, но range работает корректно с UTF-8 и возвращает именно символы (а не байты):

word := "го"

for i, r := range word {
	fmt.Println(i, string(r))
}

// 0 г
// 2 о

Индексы 0 и 2 — потому что символы г и о занимают по два байта каждый.

Если не нужен индекс, его можно опустить с помощью _:

for _, r := range "hexlet" {
	fmt.Printf("%c\n", r)
}

// h
// e
// x
// l
// e
// t

Цикл range будет особенно полезен при работе с коллекциями (срезами, словарями и т.п.), к которым мы перейдём в следующих уроках.

Задание

Реализуйте функцию RepeatWord(), которая принимает два аргумента: строку word и целое число times. Функция должна вернуть новую строку, в которой word повторяется подряд указанное количество раз без разделителей.

Если times равно 1, функция возвращает слово без изменений. Если times больше 1 — слово повторяется несколько раз.

Примеры:

RepeatWord("go", 1) // "go"
RepeatWord("go", 3) // "gogogo"
RepeatWord("a", 5)  // "aaaaa"
Коммерческий опыт и Трудоустройство

Полезное

  • The Go Programming Language Specification — For

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
/
Программирование
/
Курс Golang
/

Цикл For

Golang: Цикл For

В Go есть только одна конструкция для организации циклов — for. Она заменяет собой и while, и do while из других языков. С её помощью можно реализовать любые виды повторений.

Классический цикл со счётчиком

Наиболее распространённый способ перебора:

for i := 0; i < 5; i++ {
	fmt.Println(i)
}
// 0
// 1
// 2
// 3
// 4

Здесь:

  • i := 0 — инициализация переменной.
  • i < 5 — условие выполнения.
  • i++ — шаг итерации.

Цикл с только условием

Такой for работает как while в других языках:

i := 0
for i < 5 {
	fmt.Println(i)
	i++
}

// 0
// 1
// 2
// 3
// 4

Бесконечный цикл

for {
	fmt.Println("Hello, Hexlet")
}

// Hello, Hexlet
// Hello, Hexlet
// Hello, Hexlet
// Hello, Hexlet
// Hello, Hexlet
// Hello, Hexlet
// Hello, Hexlet
// ...
// Hello, Hexlet

Обычно используется с break или return внутри тела, чтобы остановить выполнение.

Повторение действий с помощью range

В Go существует альтернативный вариант цикла для задачи повторения какого-то действия n раз. Вместо привычного счётчика i := 0; i < n; i++, можно использовать конструкцию for range.

for range 3 {
	fmt.Println("Hello!")
}

// Hello!
// Hello!
// Hello!

Если понадобится использовать номер итерации, вы можете явно объявить переменную:

for i := range 5 {
	fmt.Println("Итерация номер", i)
}

// Итерация номер 0
// Итерация номер 1
// Итерация номер 2
// Итерация номер 3
// Итерация номер 4

Такой цикл начинается с 0 и заканчивается на n - 1 — как в обычном счётчике.

Перебор строки посимвольно

Цикл for ... range позволяет пройтись по строке символ за символом. Внутри цикла доступны:

  • Индекс символа.
  • Сам символ в виде rune (Unicode).
text := "go"

for i, r := range text {
	fmt.Printf("Индекс: %d, Символ: %c\n", i, r)
}

// Индекс: 0, Символ: g
// Индекс: 1, Символ: o

Что делает range?

  • Возвращает индекс текущего элемента (в байтах).
  • Возвращает символ в виде rune — это Unicode-код символа.

Строка в Go — это последовательность байт, но range работает корректно с UTF-8 и возвращает именно символы (а не байты):

word := "го"

for i, r := range word {
	fmt.Println(i, string(r))
}

// 0 г
// 2 о

Индексы 0 и 2 — потому что символы г и о занимают по два байта каждый.

Если не нужен индекс, его можно опустить с помощью _:

for _, r := range "hexlet" {
	fmt.Printf("%c\n", r)
}

// h
// e
// x
// l
// e
// t

Цикл range будет особенно полезен при работе с коллекциями (срезами, словарями и т.п.), к которым мы перейдём в следующих уроках.

Задание

Реализуйте функцию RepeatWord(), которая принимает два аргумента: строку word и целое число times. Функция должна вернуть новую строку, в которой word повторяется подряд указанное количество раз без разделителей.

Если times равно 1, функция возвращает слово без изменений. Если times больше 1 — слово повторяется несколько раз.

Примеры:

RepeatWord("go", 1) // "go"
RepeatWord("go", 3) // "gogogo"
RepeatWord("a", 5)  // "aaaaa"
Коммерческий опыт и Трудоустройство

Полезное

  • The Go Programming Language Specification — For

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются
← ПредыдущийСледующий →
← ПредыдущийСледующий →
← ПредыдущийСледующий →

Ваше упражнение проверяется по этим тестам

package solution

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestRepeatWord(t *testing.T) {
	a := assert.New(t)

	a.Equal("go", RepeatWord("go", 1))
	a.Equal("gogogo", RepeatWord("go", 3))
	a.Equal("aaaaa", RepeatWord("a", 5))
	a.Equal("", RepeatWord("any", 0)) // дополнительный тест: повторить 0 раз
}
← ПредыдущийСледующий →

Решение учителя откроется через:

20:00

waiting_clock
← ПредыдущийСледующий →