Голанг Фор Лооп Туториал [With Examples]

Otkrijte sve tajne Go programskog jezika vezane za petlje, prolazeći kroz praktične primere kodiranja.

U poslednje vreme, jezici poput Rust-a, Go-a i TypeScript-a stekli su ogromnu popularnost među programerima. Ako vas zanima razvoj backend-a i DevOps, Go je odličan izbor za učenje!

Za početnike koji savladavaju osnove programiranja, petlje su među ključnim konceptima koje je neophodno razumeti.

Go pruža samo jednu vrstu petlje, a to je `for` petlja. Naučićemo kako se ona koristi, ali i kako pomoću nje simulirati druge tipove petlji.

Krenimo!

Sintaksa Go `for` petlje

U Go-u, `for` petlja se kreira na sledeći način:

for inicijalizacija; uslov; ažuriranje {
    // kod koji se izvršava
}

Gde:

  • inicijalizacija definiše početnu vrednost promenljive petlje.
  • uslov je logički izraz koji određuje da li će se telo petlje izvršavati. Sve dok je uslov `true`, naredbe unutar petlje se izvršavaju. Kada uslov postane `false`, petlja se prekida.
  • ažuriranje vrši izmenu vrednosti promenljive petlje – najčešće se radi o inkrementiranju ili dekrementiranju.

💡 Obratite pažnju kako je sintaksa slična C `for` petlji, samo bez zagrada.

Evo kako teče kontrola u Go `for` petlji:

Vreme je za kodiranje! ⏰ Možete koristiti lokalnu Go instalaciju ili isprobati primere na Go Playground-u.

Primjeri Go `for` petlji

Iskoristimo novostečeno znanje sintakse da napišemo našu prvu `for` petlju. Ovo je jednostavna petlja koja ispisuje brojeve od 1 do 5, korakom od 1.

package main

import "fmt"

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

Promenljiva petlje `i` se inicijalizuje na 1, uslov je `i <= 5`, a nakon svake iteracije se `i` uvećava za 1. Rezultat je:

//Izlaz
For petlja:
1
2
3
4
5

Napišimo još jednu `for` petlju. Ova petlja kreće od 5 i odbrojava do 1, nastavljajući izvršavanje sve dok je promenljiva petlje veća ili jednaka 1. Promenljiva petlje se smanjuje za jedan u svakoj iteraciji.

package main

import "fmt"

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

I očekivani izlaz je:

//Izlaz
For petlja:
5
4
3
2
1

Koja je oblast važenja promenljive petlje?

Oblast važenja promenljive petlje ograničena je na blok `for` petlje i nije dostupna izvan nje.

Da bismo to proverili, pokušaćemo da pristupimo vrednosti promenljive petlje i izvan petlje:

package main

import "fmt"

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

}

Kao što se i očekuje, dobijamo grešku da `i` nije definisano (njena oblast važenja je ograničena na `for` petlju):

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

Beskonačna `for` petlja u Go-u

Da li je moguće imati beskonačne `for` petlje u Go-u? Da, svakako!

Ako pogledamo kontrolni tok `for` petlje:

  • Telo petlje će se nastaviti izvršavati dok je uslov `true`.
  • Kada uslov postane `false`, petlja se zaustavlja.
  • Dakle, ako uslov nikada ne postane `false` (ili je uvek `true`), imamo beskonačnu petlju.

Takođe možete koristiti `for` petlju bez inicijalizacije, uslova i ažuriranja – bez grešaka sintakse. Dakle, moguće je napraviti beskonačnu petlju koristeći `for` strukturu poput ove:

package main

import "fmt"

func main() {
	for {
	   fmt.Println("Izvrsava se...")
	}
}
//Izlaz
Izvrsava se...
Izvrsava se...
Izvrsava se...
Izvrsava se...
Izvrsava se...
//i tako u nedogled!

U ovom primeru, promenljiva `num` je postavljena na 5. Uslov petlje je `num >= 5`. Zato petlja traje sve dok je `num` veće ili jednako nuli.

package main

import "fmt"

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

Pošto se vrednost `num` nikada ne menja, uslov je uvek `true`, i petlja se izvršava beskonačno!

//Izlaz
5
5
5
5
5
5
//i tako u nedogled!

Pošto Go ima samo `for` petlju, možemo pokušati da simuliramo `while` i `do-while` petlje koristeći `for` petlje. Hajde da vidimo kako to možemo uraditi!

Simuliranje `while` petlje pomoću `for` petlje

`While` petlja generalno ima sledeći oblik:

// inicijalizacija promenljive petlje
while (uslov){
    // kod koji se izvršava
    // ažuriranje promenljive petlje
} 

Ako se sećate, u primeru beskonačne `for` petlje, koristili smo `for` petlju bez inicijalizacije, uslova i ažuriranja:

for {
// najjednostavnija beskonačna petlja
}

Možemo izmeniti `for` petlju da sadrži samo uslov (u sledećem obliku) da simuliramo `while` petlju:

//inicijalizacija promenljive petlje
for uslov {
 // kod koji se izvršava
 // ažuriranje promenljive petlje
}

Evo ekvivalenta `while` petlje prvoj `for` petlji koju smo napisali:

package main

import "fmt"

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

Simuliranje `do-while` petlje pomoću `for` petlje

Ako ste programirali u jeziku kao što je C, znate da `do-while` petlja ima sledeći oblik:

// inicijalizacija promenljive petlje
do {
//kod koji se izvršava
// ažuriranje promenljive petlje
} while(uslov);

Glavna razlika između `while` i `do-while` petlje je u tome što `while` petlja proverava uslov na početku, pre ulaska u petlju. `Do-while` petlja, s druge strane, proverava uslov nakon izvršavanja tela petlje.

Dakle, kod `while` petlje, ako je uslov `false`, telo petlje se nikada ne izvršava. Međutim, kod `do-while` petlje, telo petlje se izvršava makar jednom, čak i ako je uslov `false`.

Koristeći ovu informaciju, možemo simulirati `do-while` petlju:

  • Napišite beskonačnu `for` petlju.
  • Koristite `if` sa odgovarajućim uslovom da izađete iz petlje.

Pretpostavimo da želite da napišete `do-while` petlju gde se telo petlje izvršava ako je `num` < 0. Možete napisati `for` petlju i prekinuti izvršavanje ako je `num` >= 0.

package main

import "fmt"

func main() {
	fmt.Println("Simulacija do-while petlje")
	num := 5
	for {
		fmt.Println("Petlja se izvrsava...")
		if num >= 0 {
			break
		}
	}
}

💡 Važno je napomenuti da su uslovi: izvršavanje petlje ako je `num` < 0 i izlazak iz petlje ako je `num` >= 0, ekvivalentni uslovi.

Iako je uslov `num > 0` u početku `false` (jer je `num` = 5), telo petlje se izvršava jednom, simulirajući `do-while` petlju.

//Izlaz
Simulacija do-while petlje
Petlja se izvrsava...

Petlja kroz nizove pomoću `for` petlje

Kada prolazite kroz nizove u Go-u pomoću `for` petlje i `range`, možete pristupiti i indeksima i elementima. Slično je `enumerate` funkciji u Python-u.

Kreiramo `numArray`, niz celih brojeva, i prolazimo kroz njega pomoću `for` petlje:

package main

import "fmt"

func main() {
	fmt.Println("Prolazak kroz niz")
	numArray := []int{3, 7, 0, 10, 8, 9}
	for idx, num := range numArray {
		fmt.Println("Na indeksu", idx, ": ", num)
	}
}

Kao što vidite, možemo istovremeno pristupiti indeksu i elementu u svakom indeksu:

//Izlaz
Prolazak kroz niz
Na indeksu 0 :  3
Na indeksu 1 :  7
Na indeksu 2 :  0
Na indeksu 3 :  10
Na indeksu 4 :  8
Na indeksu 5 :  9

Upotreba `defer` u Go `for` petlji

U Go-u, možete koristiti ključnu reč `defer` da odložite izvršavanje funkcija.

Iako se najčešće koristi za čišćenje resursa i obradu grešaka, korisno je razumeti kako se `defer` koristi unutar `for` petlje. Pogledajmo šta se dešava kada koristimo `defer` unutar `for` petlje za odlaganje poziva funkcije `Println()`.

package main

import "fmt"

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

💬 Kada se poziv funkcije odloži, gura se na stek i izvršava u LIFO (poslednji ušao, prvi izašao) redosledu. Ovo izvršavanje se dešava tek nakon što se završi funkcija koja sadrži `defer` naredbu.

Dakle, `fmt.Println(5)` se izvršava prvi, a `fmt.Println(1)` se izvršava poslednji:

//Izlaz
For petlja:
5
4
3
2
1

Zaključak

Evo sažetka onoga što ste naučili u ovom vodiču:

  • U Go-u, `for` petlje se kreiraju sa sintaksom: `for inicijalizacija; uslov; ažuriranje { //telo petlje }`.
  • Kontrolni tok `for` petlje je prilično jednostavan. Promenljiva petlje se inicijalizuje jednom, uslov određuje da li će se telo petlje izvršiti, a ažuriranje se odnosi na promenu promenljive petlje nakon svake iteracije.
  • Oblast važenja promenljive petlje ograničena je na telo petlje i nije dostupna izvan nje.
  • Iako Go pruža samo `for` petlju, možete simulirati ponašanje `while` i `do-while` petlji koristeći `for` petlje.
  • Neke druge primene `for` petlje uključuju prolazak kroz nizove i odlaganje poziva funkcija unutar tela `for` petlje.

Sledeće, naučite kako se koriste `for` petlje u Python-u. Srećno učenje! 🎉