Пост Все способы написания циклов в Go впервые появился на Qvault.

Цикл for многократно выполняет блок кода, и в Golang есть несколько разных способов его написать.

  1. Стандартный трехкомпонентный шлейф
  2. For-range loop
  3. Диапазон за срезом
  4. Диапазон на карте
  5. Дальность по каналу
  6. Диапазон по струне
  7. Пока цикл
  8. Цикл дополнительных компонентов
  9. "Бесконечный цикл"
  10. Отрыв от петли
  11. Продолжить (перейти к следующей итерации) в цикле

# 1 Стандартный трехкомпонентный шлейф

Go имеет довольно стандартный синтаксис для трехкомпонентного цикла, к которому вы, вероятно, привыкли в C, Java или JavaScript. Большая разница в том, что компоненты не заключены в круглые скобки.

for i := 0; i < 100; i++ {
    sum += i
}

Этими тремя компонентами являются оператор init i := 0, условие i < 100 и оператор post i++. Шаги выполнения цикла следующие.

  1. Оператор init выполняется, и объявленные там переменные становятся доступными в области тела цикла.
  2. Условие вычисляется. Если он оценивается как true, то тело выполняется, в противном случае цикл завершается.
  3. Выполняется почтовая выписка.
  4. Шаг 2 повторяется.

# 2 Цикл для диапазона

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

Диапазон в Go

fruits := []string{"apple", "banana", "pear"}
for i, fruit := range fruits {
    fmt.Println(i, s)
}
// prints:
// 0 apple
// 1 banana
// 2 pear

Дальность над картой в Go

ages := map[string]int{
    "lane":    26,
    "preston": 28,
    "rory":    21,
}
for name, age := range ages {
    fmt.Println(name, age)
}
// prints:
// lane 26
// preston 28
// rory 21

Диапазон по каналу в Go

ch := make(chan int)
go func() {
    for i := 0; i < 3; i++ {
        ch <- i
    }
    close(ch)
}()

// loop ends when channel is close
for value := range ch {
    fmt.Println(value)
}
fmt.Println("channel closed")

// prints:
// 0
// 1
// 2
// channel closed

Диапазон по строке в Go

name := "lane"
for i, char := range name {
     // cast the rune to a string for printing 
     fmt.Println(i, string(char))
}

// prints
// 0 l
// 1 a
// 2 n
// 3 e

# 3 Пока цикл

Используя один компонент в сигнатуре цикла for, а не три, мы можем эффективно построить цикл while в Golang. В Go нет ключевого слова while.

sum := 1
for sum < 10 {
    sum += sum
}
fmt.Println(sum)

# 4 Цикл дополнительных компонентов

Основываясь на идее гибкого цикла for, мы можем опускать операторы init или post трехкомпонентного цикла по своему усмотрению.

i := 0
for ; sum < 1000; i++ {
    sum += i
}

for i := 0; sum < 1000; {
    sum += i
    i++
}

Это может быть полезным шаблоном, когда вы хотите что-то вроде сделать-а-а или немедленного первого тика от тикера.

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

Бесконечные циклы полезны в горутинах, когда у вас есть рабочий или процесс, который должен продолжаться постоянно.

sum := 0
for {
    sum++ // repeated forever
}
// never reached, loops continues on forever

# 6 Отрыв от петли

Ранний выход из цикла может быть полезен, особенно в цикле навсегда. break ключевые слова немедленно выходят из цикла.

sum := 0
for {
    sum++
    if sum >= 1000 {
        break
    }
}
fmt.Println(sum)

// prints:
// 1000

# 7 Продолжить (перейти к следующей итерации) в цикле

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

for i := 0; i < 10; i++{
    if i % 2 == 0 {
        continue
    }
    fmt.Println(i, "is odd")
}

// prints
// 1 is odd
// 3 is odd
// 5 is odd
// 7 is odd
// 9 is odd

Спасибо, что прочитали, теперь пройдите курс!

Заинтересованы в высокооплачиваемой работе в сфере высоких технологий? Посещайте собеседования и успешно проходите их после прохождения практических курсов программирования.

Начни кодирование сейчас

Вопросы?

Подпишитесь на меня в Twitter @q_vault, если у вас есть какие-либо вопросы или комментарии. Если я допустил ошибку в статье, обязательно дайте мне знать, чтобы я исправил ее!

Подпишитесь на мою рассылку, чтобы получать больше статей по кодированию прямо на ваш почтовый ящик.