Samouczek Golang For Loop [With Examples]

Dowiedz się wszystkiego o pętlach Golang for, kodując kilka przydatnych przykładów.

Ostatnio języki programowania, takie jak Rust, Golang i TypeScript, stały się bardzo popularne wśród programistów. Jeśli interesuje Cię back-end development i DevOps, powinieneś rozważyć naukę Golanga jako doskonałą opcję!

Jeśli dopiero zaczynasz poznawać podstawy języka programowania, konstrukcje pętli są jednym z pierwszych pojęć, które powinieneś zrozumieć.

Golang zapewnia tylko konstrukcję pętli for. Dowiemy się również o pętlach for, a także o tym, jak emulować inne pętle za pomocą pętli for.

Zaczynajmy!

Składnia pętli Golang For

W Golang możesz utworzyć pętlę for, używając następującej składni:

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

Tutaj,

  • inicjalizacja oznacza inicjalizację zmiennej pętli.
  • warunek jest warunkiem pętli, który określa wykonanie ciała pętli. Tak długo, jak warunek pętli ma wartość true, instrukcje w ciele pętli są wykonywane. A kiedy warunek staje się fałszywy, sterowanie opuszcza pętlę.
  • aktualizacja oznacza aktualizację zmiennej pętli — zwykle przyrost lub spadek.

💡 Zauważ, że jest to podobne do pętli C for tylko bez nawiasów.

Oto przepływ sterowania w Golang dla pętli:

Czas na kodowanie kilku przykładów!⏰ Aby razem kodować, możesz użyć lokalnej instalacji Golanga lub uruchomić przykłady na Go Playground.

Przykłady pętli Golang For

Użyjmy składni, której właśnie się nauczyliśmy, aby napisać naszą pierwszą pętlę for. Oto prosta pętla for, która wypisuje liczby od 1 do 5 w krokach co jeden.

package main

import "fmt"

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

Inicjujemy zapętloną zmienną i na 1, ustawiamy warunek na i <= 5 i zwiększamy zapętloną zmienną o jeden po każdej iteracji. A oto wyjście:

//Output
For loop:
1
2
3
4
5

Napiszmy kolejną pętlę for. Ta pętla zaczyna się od 5 i odlicza do 1; trwa to do momentu, gdy zmienna zapętlona będzie większa lub równa 1. Zatem zmniejszamy zmienną zapętloną o jeden po każdej iteracji.

package main

import "fmt"

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

I otrzymujemy oczekiwany wynik:

//Output
For loop:
5
4
3
2
1

Jaki jest zakres zmiennej pętli?

Zakres zmiennej pętli jest ograniczony do bloku pętli for i nie jest dostępny poza pętlą.

Aby to zweryfikować, spróbujmy uzyskać dostęp do wartości zapętlonej zmiennej i poza pętlą:

package main

import "fmt"

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

}

Zgodnie z oczekiwaniami napotkaliśmy błąd, który mówi, że i jest niezdefiniowane (a jego zakres jest ograniczony do pętli for):

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

Nieskończona pętla For w Golang

Czy możemy mieć nieskończone pętle for w Go? Tak, z pewnością możemy!

Jeśli spojrzysz na przepływ sterowania pętli for:

  • Treść pętli będzie wykonywana tak długo, jak długo warunek będzie miał wartość true.
  • Gdy warunek staje się fałszywy, formant opuszcza pętlę.
  • Więc jeśli warunek nigdy nie staje się fałszywy (lub zawsze jest prawdziwy), mamy nieskończoną pętlę.

Ale możesz też użyć pętli for bez inicjalizacji, warunku i aktualizacji — bez popełniania błędów składniowych. Więc jeśli możesz sprawić, by pętla działała w nieskończoność, nawet używając konstrukcji pętli for takiej jak ta:

package main

import "fmt"

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

W tym przykładzie ustawiamy zmienną num na 5. Warunek pętli to num >= 5. Zatem pętla działa tak długo, jak długo num jest większe lub równe zeru.

package main

import "fmt"

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

Ponieważ wartość num nigdy się nie zmienia, warunek zawsze przyjmuje wartość true, a pętla działa w nieskończoność!

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

All Golang ma tylko konstrukcję pętli for, możemy spróbować naśladować pętle while i do-while za pomocą pętli for. Nauczmy się więc, jak to robić!

Emulowanie pętli while za pomocą pętli For

Pętla while zwykle przyjmuje następującą postać:

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

Jeśli pamiętasz, w pierwszej nieskończonej pętli for napisaliśmy: wykorzystaliśmy następującą pętlę for — bez inicjalizacji, warunku i aktualizacji.

for {
// the simplest infinite loop
}

Możemy więc zmodyfikować pętlę for, aby zawierała tylko warunek (w następującej formie) emulujący pętlę while:

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

Oto odpowiednik pętli while pierwszej pętli for, którą napisaliśmy:

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

Emulowanie pętli Do-While za pomocą pętli For

Jeśli kodowałeś w języku takim jak C, wiesz, że konstrukcja pętli do-while ma następującą postać:

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

Kluczowa różnica między pętlą while i do while polega na tym, że pętla while sprawdza warunek przy wejściu do pętli. Z drugiej strony pętla do-while sprawdza warunek po wyjściu z pętli.

Tak więc w pętli while, jeśli warunek ma wartość false, treść pętli nigdy się nie wykonuje. Jednak w pętli do-while treść pętli jest wykonywana, nawet jeśli warunek ma wartość false.

Korzystając z tych informacji, możemy naśladować zachowanie pętli do-while:

  • Napisz nieskończoną pętlę for
  • Użyj instrukcji warunkowej if z poprawnym warunkiem, aby wyrwać się z pętli

Powiedzmy, że chcesz napisać pętlę do-while, w której warunkiem wykonania treści pętli jest num < 0. Możesz więc napisać pętlę for i wyjść z pętli, jeśli 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
		}
	}
}

💡 Zauważ, że wykonanie pętli, jeśli num < 0 i przerwanie pętli, jeśli num >= 0, są warunkami równoważnymi.

Chociaż warunek num > 0 jest początkowo fałszywy (num wynosi 5), treść pętli jest wykonywana raz, emulując pętlę do-while.

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

Zapętlanie tablic za pomocą pętli For

Podczas zapętlania tablic w Golang przy użyciu pętli for i zakresu można uzyskać dostęp zarówno do indeksów, jak i elementów. Działa to podobnie do funkcji enumerate w Pythonie.

Tutaj tworzymy numArray, tablicę liczb całkowitych. I przejdź przez to za pomocą pętli 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)
	}
}

Jak widać, jesteśmy w stanie jednocześnie uzyskać dostęp zarówno do indeksu, jak i elementu w każdym indeksie:

//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

Używanie odroczenia w Golang For Loop

W Golang możesz użyć słowa kluczowego defer, aby odroczyć wywołania funkcji.

Chociaż jest używany w aplikacjach takich jak czyszczenie zasobów i obsługa błędów, pomocne może być zrozumienie, jak używać odroczenia wewnątrz pętli for. Zobaczmy, co się stanie, gdy użyjemy defer wewnątrz pętli for, aby odroczyć wywołania funkcji Println().

package main

import "fmt"

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

💬 Kiedy wywołanie funkcji jest odroczone, wywołanie funkcji jest umieszczane na stosie i wykonywane w kolejności LIFO. To wykonanie ma miejsce dopiero po powrocie funkcji otaczającej instrukcję odroczenia.

Zatem fmt.Println(5) jest wykonywany jako pierwszy, a fmt.Println(1) jako ostatni:

//Output
For loop:
5
4
3
2
1

Wniosek

Oto podsumowanie tego, czego nauczyłeś się w tym samouczku:

  • W Golangu możesz tworzyć pętle for ze składnią: for initialization; stan : schorzenie; aktualizacja { //ciało pętli}.
  • Przepływ sterowania w pętli for jest dość prosty. Zmienna zapętlona jest inicjowana raz, warunek wyszukiwania określa, czy wykonać treść pętli, a aktualizacja odnosi się do aktualizacji zapętlonej zmiennej po każdej iteracji.
  • Zakres zmiennej pętli jest ograniczony do ciała pętli i nie jest dostępny poza pętlą.
  • Chociaż Golang zapewnia tylko konstrukcję pętli for, możesz emulować zachowania pętli while i do-while za pomocą pętli for.
  • Kilka innych zastosowań pętli for obejmuje przechodzenie przez tablice i odraczanie wywołań funkcji wewnątrz ciała pętli for.

Następnie naucz się używać pętli for w Pythonie. Miłej nauki!🎉