Підручник Golang For Loop [With Examples]

Дізнайтеся все про цикли Golang for, закодувавши кілька корисних прикладів.

Останнім часом такі мови програмування, як Rust, Golang і TypeScript, стали надзвичайно популярними серед розробників. Якщо вас цікавить бекенд-розробка та DevOps, вам варто розглянути можливість вивчення Golang як чудовий варіант!

Якщо ви новачок, який вивчає основи мови програмування, конструкція циклу є однією з перших концепцій, яку вам слід зрозуміти.

Golang надає лише конструкцію циклу for. І ми дізнаємося про цикли for, а також про те, як емулювати інші цикли за допомогою циклу for.

Давайте почнемо!

Синтаксис Golang For Loop

У Golang ви можете створити цикл for за допомогою такого синтаксису:

for initialization; condition; update {
    // do something
}

тут,

  • ініціалізація позначає ініціалізацію змінної циклу.
  • умова — це умова циклу, яка визначає виконання тіла циклу. Поки умова циклу виконується, оператори в тілі циклу виконуються. І коли умова стає хибною, керування виходить із циклу.
  • update позначає оновлення змінної циклу—зазвичай інкремент або декремент.

💡 Зверніть увагу, як це схоже на цикл C for лише без дужок.

Ось потік керування в циклах Golang for:

Час написати кілька прикладів!⏰ Щоб написати разом, ви можете скористатися локальною установкою Golang або запустити приклади на Go Playground.

Приклади циклу Golang For

Давайте використаємо синтаксис, який ми щойно вивчили, щоб написати наш перший цикл for. Ось простий цикл for, який виводить числа від 1 до 5 із кроком один.

package main

import "fmt"

func main() {
	fmt.Println("For loop:")
	num := 5
	for i := 1; i <= num; i++ {
		fmt.Println(i)
	}
}

Ми ініціалізуємо змінну циклу i рівним 1, встановлюємо умову i <= 5 і збільшуємо змінну циклу на одиницю після кожної ітерації. І ось результат:

//Output
For loop:
1
2
3
4
5

Напишемо ще один цикл for. Цей цикл починається з 5 і веде зворотний відлік до 1; це продовжується, доки змінна циклу не стане більшою або дорівнює 1. Тому ми зменшуємо змінну циклу на одиницю після кожної ітерації.

package main

import "fmt"

func main() {
	fmt.Println("For loop:")
	num := 5
	for i := num; i >= 1; i-- {
		fmt.Println(i)
	}
}

І ми отримуємо очікуваний результат:

//Output
For loop:
5
4
3
2
1

Що таке область дії змінної циклу?

Область дії змінної циклу обмежена блоком циклу for і недоступна поза циклом.

  Балансувальник навантаження Tomcat із Apache із використанням Mod Proxy і Session Sticky

Щоб перевірити це, давайте спробуємо отримати доступ до значення змінної циклу i поза циклом:

package main

import "fmt"

func main() {
	fmt.Println("For loop:")
	num := 5
	for i := 1; i <= num; i++ {
		fmt.Println(i)
	}
	fmt.Println(i)

}

Як і очікувалося, ми зіткнулися з помилкою, що i є невизначеним (і його область обмежена циклом for):

// Output
./prog.go:11:14: undefined: i

Нескінченний цикл For у Golang

Чи можемо ми мати нескінченні цикли for у Go? Так, ми точно можемо!

Якщо ви подивитеся на потік керування циклом for:

  • Тіло циклу продовжуватиме виконуватися до тих пір, поки умова оцінюється як істина.
  • Коли умова стає хибною, елемент керування виходить із циклу.
  • Отже, якщо умова ніколи не стає хибною (або завжди істинною), ми маємо нескінченний цикл.

Але ви також можете використовувати цикл for без ініціалізації, умови та оновлення — без синтаксичних помилок. Отже, якщо ви можете змусити цикл працювати нескінченно, навіть використовуючи таку конструкцію циклу for:

package main

import "fmt"

func main() {
	for {
	   fmt.Println("running...")
	}
}
//Output
running...
running...
running...
running...
running...
//and it goes on forever!

У цьому прикладі ми встановлюємо змінну num рівним 5. А умовою циклу є num >= 5. Отже, цикл виконується до тих пір, поки num більше або дорівнює нулю.

package main

import "fmt"

func main() {
	num := 5
	for num > 0 {
		fmt.Println(num)
	}
}

Оскільки значення num ніколи не змінюється, умова завжди оцінюється як істина, і цикл працює вічно!

//Output
5
5
5
5
5
5
//and it goes on forever!

Весь Golang має лише конструкцію циклу for, ми можемо спробувати емулювати цикли while і do-while за допомогою циклів for. Тож давайте навчимося це робити!

  Як працюють складні телефони і коли я їх отримаю?

Емуляція циклу While за допомогою циклу For

Цикл while зазвичай має таку форму:

// initialize looping var
while (condition){
    // do something
    // update looping var
} 

Якщо ви пам’ятаєте, у першому нескінченному циклі for ми писали: ми використовували такий цикл for — без ініціалізації, умови та оновлення.

for {
// the simplest infinite loop
}

Тож ми можемо змінити цикл for, щоб він містив лише умову (у наступній формі) для емуляції циклу while:

//initialize looping var
for condition {
 // do something
 // update looping var
}

Ось еквівалент циклу while першого циклу for, який ми написали:

package main

import "fmt"

func main() {
	fmt.Println("Emulating while loop")
	num := 5
	for num > 0 {
		fmt.Println(num)
		num--
	}
}
//Output
Emulating while loop
5
4
3
2
1

Емуляція циклу Do-While за допомогою циклу For

Якщо ви писали на мові, як-от C, ви знаєте, що конструкція циклу do-while має таку форму:

// initialize looping var
do {
//something
// update looping var
} while(condition);

Ключова відмінність між циклами while і do while полягає в тому, що цикл while перевіряє умову після входу в цикл. З іншого боку, цикл do-while перевіряє умову після виходу з циклу.

Отже, у циклі while, якщо умова оцінюється як false, тіло циклу ніколи не виконується. Однак у циклі do-while тіло циклу виконується, навіть якщо умова оцінюється як false.

Використовуючи цю інформацію, ми можемо емулювати поведінку циклу do-while:

  • Напишіть нескінченний цикл for
  • Щоб вийти з циклу, використовуйте умовний оператор if із правильною умовою

Скажімо, ви хочете написати цикл do-while, де умова для виконання тіла циклу — num < 0. Отже, ви можете написати цикл for і вийти з циклу, якщо num >= 0.

package main

import "fmt"

func main() {
	fmt.Println("Emulating do-while loop")
	num := 5
	for {
		fmt.Println("loop runs...")
		if num >= 0 {
			break
		}
	}
}

💡 Зауважте, що виконання циклу, якщо num < 0, і вихід із циклу, якщо num >= 0, є еквівалентними умовами.

Хоча умова num > 0 спочатку є хибною (num дорівнює 5), тіло циклу виконується один раз, емулюючи цикл do-while.

//Output
Emulating do-while loop
loop runs...

Перегляд масивів за допомогою циклу For

Перебираючи масиви в Golang за допомогою циклу for і діапазону, ви можете отримати доступ як до індексів, так і до елементів. Це працює подібно до функції enumerate в Python.

  Як налаштувати робочий стіл Budgie

Тут ми створюємо numArray, масив цілих чисел. І прокрутіть його за допомогою циклу for:

package main

import "fmt"

func main() {
	fmt.Println("Looping through an array")
	numArray := []int{3, 7, 0, 10, 8, 9}
	for idx, num := range numArray {
		fmt.Println("At index", idx, ": ", num)
	}
}

Як бачимо, ми можемо отримати доступ як до індексу, так і до елемента в кожному індексі одночасно:

//Output
Looping through an array
At index 0 :  3
At index 1 :  7
At index 2 :  0
At index 3 :  10
At index 4 :  8
At index 5 :  9

Використання defer у Golang For Loop

У Golang ви можете використовувати ключове слово defer для відкладення викликів функцій.

Хоча він використовується в таких програмах, як очищення ресурсів і обробка помилок, він може бути корисним для розуміння того, як використовувати defer у циклі for. Давайте подивимося, що відбувається, коли ми використовуємо defer всередині циклу for, щоб відкласти виклики функції Println().

package main

import "fmt"

func main() {
	fmt.Println("For loop:")
	num := 5
	for i := 1; i <= num; i++ {
		defer fmt.Println(i)
	}
}

💬 Коли виклик функції відкладено, виклик функції надсилається в стек і виконується в порядку LIFO. Це виконання відбувається лише після повернення функції, яка оточує оператор defer.

Отже, fmt.Println(5) виконується першим, а fmt.Println(1) – останнім:

//Output
For loop:
5
4
3
2
1

Висновок

Ось підсумок того, що ви дізналися в цьому посібнику:

  • У Golang ви можете створювати цикли for із синтаксисом: для ініціалізації; хвороба; update { //тіло циклу}.
  • Потік керування циклом for досить простий. Змінна циклу ініціалізується один раз, умова пошуку визначає, чи слід виконувати тіло циклу, а оновлення стосується оновлення змінної циклу після кожної ітерації.
  • Область дії змінної циклу обмежена тілом циклу та недоступна поза циклом.
  • Хоча Golang надає лише конструкцію циклу for, ви можете емулювати поведінку циклів while і do-while за допомогою циклів for.
  • Кілька інших застосувань циклу for включають цикл через масиви та відкладення викликів функцій у тілі циклу for.

Далі дізнайтеся, як використовувати цикли for у Python. Гарного навчання!🎉