Идти от начала – работа с петлями


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 есть три подхода, которые вы можете использовать в этой статье.

Оцените статью
Procodings.ru
Добавить комментарий