Go с самого начала – работа с циклами
TLDR; в этой статье рассматривается работа с циклами в Go.
Скорее всего, вы захотите повторить набор инструкций. Например, у вас может быть список заказов, где вам нужно обработать каждый заказ. Или у вас есть файл, который нужно прочитать построчно, или может быть какой-то другой расчет. Независимо от ситуации, вам, скорее всего, понадобится циклическая конструкция, так какие же варианты есть в Go?
Вы используете цикл for
. Есть три основных способа его использования:
- инкрементные шаги. С помощью переменной вы определяете начальную точку, условие, когда нужно остановиться, и шаг приращения. Это ваш “классический” цикл for. Вот как это выглядит:
for i := 0; i < 10; i++ {
// run these statements
}
- while. Во многих языках программирования есть ключевое слово
while
. В Go его нет, но вы можете использовать цикл for аналогичным образом. Вы опустите шаг инициализации и шаг инкремента и получите следующий код:
for <condition> {
// run these statements
}
- для каждого. Наконец, у вас есть конструкция
for-each
, которая работает с массивом как последовательность. Она использует ключевое словоrange
для работы:
for i,s := range array {
// run these statements
}
Серия
- Ваша первая программа
- Переменные
- If и else
- Преобразования
- Циклы, вы здесь
- Пользовательский ввод
- Функции
- Обработка ошибок
Цикл for
Обычный цикл for состоит из трех отдельных частей:
- инициализация, здесь вы хотите создать переменную и присвоить ей начальное значение, например, так:
for i:= 0;
Обратите внимание на использование ;
, обычно вы не используете точку с запятой, но для этой конструкции она необходима.
- условие. Следующий шаг – оценка того, следует ли продолжать инкремент или нет. Здесь задается булево выражение, которое, если
true
, продолжает цикл:
for i := 0; i< 10
i < 10
, пока значение находится между 0 и 10 (становится 10, тогда цикл прерывается), тогда оно возвращает true
и цикл продолжается.
- инкремент, на этом шаге обновляется переменная цикла
i
, обычно она обновляется на 1, но вы можете добавить любой размер инкремента, отрицательный или положительный.
for i := 0; i< 10; i++ {
}
Здесь i
обновляется на 1. Этот цикл будет выполняться десять раз.
Повторяйте до тех пор, пока не будет выполнено условие с помощью while
.
В упрощенной версии этого цикла можно опустить шаг инициализации и инкремента. Тогда останется только шаг условия. Этот шаг проверяет, является ли переменная истинной или ложной, и цикл завершается при ложном значении. Вот пример:
i := 1
for i < 10 {
i++
// do something
}
В данном случае мы объявляем i
вне цикла. Внутри цикла нам нужно изменить значение на такое, чтобы выражение цикла оценивалось как false, иначе цикл будет идти вечно.
Вот другой код, использующий ту же идею, но на этот раз мы запрашиваем ввод от пользователя:
var keepGoing = true
answer := ""
for keepGoing {
fmt.Println("Type command: ")
fmt.Scan(&answer)
if answer == "quit" {
keepGoing = false
}
}
fmt.Println("program exit")
Пример выполнения программы может выглядеть следующим образом:
Type command: test
Type command: something
Type command: quit
program exit
Использование for each
в диапазоне
Для следующей конструкции цикла идея заключается в том, чтобы работать с массивом или какой-то известной последовательностью. Для каждой итерации вы можете получить индекс, а также следующий элемент в цикле. Вот несколько примеров кода:
arr := []string{"arg1", "arg2", "arg3"}
for i, s := range arr {
fmt.Printf("index: %d, item: %s n", i, s)
}
arr
определяется как массив, а затем конструкция range
используется для цикла по массиву. На каждой итерации текущий индекс присваивается i
, а элемент массива присваивается s
. Вывод приведенного выше кода будет выглядеть следующим образом:
index: 0, item: arg1
index: 1, item: arg2
index: 2, item: arg3
Итерация по картам
Карты – это фундаментальная структура данных. Вы можете использовать range
для итерации по картам следующим образом:
kvs := map[string]string{"a": "apple", "b": "banana"}
for k, v := range kvs {
fmt.Printf("%s -> %sn", k, v)
}
Спасибо jonasbn за то, что указал на это.
Управление циклом с помощью continue
и break
До сих пор вы видели три способа использования конструкции for
. Существуют также способы управления циклом. Вы можете управлять циклом с помощью следующих ключевых слов:
arr = []int{-1,2}
for i := 0; i< 2; i++ {
fmt.Println(arr[i])
if arr[i] < 0 {
break;
}
}
Выход будет следующим:
-1
не будет выведено 2
, так как цикл завершается после первой итерации.
arr = []int{-1,2,-1, 3}
for i := 0; i< 4; i++ {
if arr[i] < 0 {
break;
}
fmt.Println(arr[i])
}
Вывод будет следующим:
2
3
Резюме
Вы узнали, что существует цикл for. Вы можете использовать цикл for-loop, когда хотите повторить набор инструкций. В Go есть три подхода, которые вы можете использовать в этой статье.