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
Цикл range
будет особенно полезен при работе с коллекциями (срезами, словарями и т.п.), к которым мы перейдём в следующих уроках.
Задание
Реализуйте функцию RepeatWord()
, которая принимает два аргумента: строку word
и целое число times
. Функция должна вернуть новую строку, в которой word
повторяется подряд указанное количество раз без разделителей.
Если times
равно 1, функция возвращает слово без изменений. Если times
больше 1 — слово повторяется несколько раз.
Примеры:
RepeatWord("go", 1) // "go"
RepeatWord("go", 3) // "gogogo"
RepeatWord("a", 5) // "aaaaa"
Полезное
Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект
Если вы зашли в тупик, то самое время поговорить с нашим асситентом Тота во вкладке "ИИ-помощник":
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Это нормально 🙆, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи. В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в обратной связи нашего сообщества
Ваше упражнение проверяется по этим тестам
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
