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
