1 Обзор операторов цикла

В языке Go операторы цикла позволяют выполнять блок кода несколько раз. Когда вам необходимо многократно выполнять определенные операции, операторы цикла становятся очень полезными. Например, вам может потребоваться перебрать каждый элемент в массиве или повторить операцию до выполнения определенного условия. В языке Go операторы цикла в основном реализуются с использованием ключевого слова for, которое является единственным оператором цикла в языке Go. Правильное использование операторов цикла критически важно для написания эффективного и поддерживаемого кода.

2 Основы цикла for

2.1 Структура цикла for

Цикл for в языке Go состоит из трех частей:

  1. Инициализирующее выражение: выполняется перед первой итерацией, обычно используется для объявления счетчика цикла.
  2. Условное выражение: вычисляется перед каждой итерацией. Если условие true, выполняется тело цикла.
  3. Послеусловие: выполняется после блока кода каждой итерации, обычно используется для обновления счетчика цикла.

Синтаксис цикла for выглядит следующим образом:

for инициализирующее выражение; условное выражение; послеусловие {
    // код тела цикла
}

2.2 Простой пример цикла for

Давайте разберем процесс выполнения цикла for на простом примере:

package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println("Значение i:", i)
    }
}

В этом примере переменная i инициализируется значением 0. Цикл for проверяет, если условие i < 5 истинно. Если условие истинно, выполняется тело цикла, и значение i выводится на экран. После выполнения тела цикла значение i обновляется с помощью i++ (операция инкремента), затем цикл снова проверяет условие, пока значение i не достигнет 5, после чего условие становится ложным, и цикл for завершается.

2.3 Примеры других циклов for

Цикл for в языке Go очень гибок и может быть записан в различных формах для обработки различных сценариев.

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

В языке Go можно опустить инициализирующее выражение, условное выражение и послеусловие цикла for, создавая бесконечный цикл, который будет выполняться, пока его не прервет оператор break или возврат из функции.

for {
    // Код внутри бесконечного цикла
    if someCondition {
        break // Выход из цикла, когда выполнено определенное условие
    }
}

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

В языке Go также можно использовать цикл for, содержащий только условие, аналогичный циклу while в других языках программирования.

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

В приведенном выше коде будет выведено 0 до 4, и цикл завершится, когда n достигнет 5.

2.3.3 Перебор массива или слайса

В языке Go ключевое слово range используется для упрощения перебора каждого элемента массива или слайса.

items := []int{1, 2, 3, 4, 5}
for index, value := range items {
    fmt.Printf("Индекс: %d, Значение: %d\n", index, value)
}

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

for _, value := range items {
    fmt.Printf("Значение: %d\n", value)
}

Примечание: Использование массивов будет подробно объяснено в последующих главах. Если вы не понимаете эту часть, это нормально, главное понять, что цикл for может быть использован таким образом.

2.3.4 Перебор элементов карты

При итерации по карте комбинация цикла for и выражения range очень мощная. Это позволяет получить каждую пару ключ-значение из карты.

colors := map[string]string{"red": "#ff000", "green": "#00ff00", "blue": "#000ff"}
for key, value := range colors {
    fmt.Printf("Ключ: %s, Значение: %s\n", key, value)
}

В этом примере мы выводим все ключи и их соответствующие значения в карте colors. Аналогично итерации по срезам, если вам нужен только ключ или значение, вы можете выбрать игнорировать другое.

Примечание: Использование карт будет подробно объяснено в последующих главах. Если вы не понимаете эту часть, не беспокойтесь, главное - понять, что цикл for можно использовать таким образом.

3 Управление ходом выполнения циклов

3.1 Использование break для завершения цикла

Иногда нам нужно преждевременно выйти из цикла, когда достигается определенное условие, и в таких случаях можно использовать оператор break. Ниже пример использования break для завершения цикла:

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i == 5 {
            break // Выход из цикла, когда i равно 5
        }
        fmt.Println("Значение i:", i)
    }
    // Вывод будет содержать только значения от 0 до 4
}

3.2 Использование continue для пропуска итераций

В определенных ситуациях может возникнуть необходимость пропустить текущую итерацию и перейти к следующей в цикле. Это можно сделать с помощью оператора continue. Вот пример:

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        if i%2 != 0 {
            continue // Пропустить эту итерацию, если i нечетное
        }
        fmt.Println("Четное число:", i)
    }
}