Mester Golang For-løkker: Nyttige eksempler & guider

En grundig introduksjon til Golang for-løkker

I den moderne utviklingsverdenen har programmeringsspråk som Rust, Golang og TypeScript oppnådd stor popularitet. Hvis du er interessert i backend-utvikling eller DevOps, er det absolutt verdt å vurdere å lære Golang!

For nybegynnere er forståelsen av loop-konstruksjoner et av de første viktige trinnene. Disse strukturene lar oss gjenta kodeblokker, noe som er avgjørende for mange programmeringsoppgaver.

Golang tilbyr kun én type loop, nemlig «for»-løkken. I denne artikkelen skal vi utforske denne konstruksjonen i dybden, samt se hvordan «for»-løkken kan brukes til å emulere andre typer løkker.

La oss komme i gang!

Syntaks for Golang «for»-løkke

Grunnleggende «for»-løkker i Golang har denne strukturen:

for initialisering; betingelse; oppdatering {
      // Kode som skal repeteres
  }

La oss se nærmere på hva hver del betyr:

  • initialisering: Her defineres og initieres løkkevariabelen.
  • betingelse: Dette er vilkåret som styrer hvor lenge løkken skal fortsette å kjøre. Så lenge betingelsen er sann, vil koden inne i løkken bli utført. Når betingelsen evalueres til usann, stopper løkken.
  • oppdatering: Dette er et uttrykk som endrer løkkevariabelen etter hver iterasjon, vanligvis ved å øke eller redusere den.

💡 Legg merke til likheten med «for»-løkker i C, men uten parenteser.

Slik fungerer kontrollflyten i Golang «for»-løkker:

Nå er det på tide å se på noen praktiske eksempler! Du kan skrive og kjøre koden enten lokalt på datamaskinen din med Golang installert, eller direkte i Go Playground.

Eksempler på Golang «for»-løkker

La oss anvende det vi nettopp har lært og skrive vår første «for»-løkke. Dette eksemplet skriver ut tallene fra 1 til 5, ett tall om gangen:

package main
import "fmt"
func main() {
    fmt.Println("For løkke:")
    num := 5
    for i := 1; i <= num; i++ {
        fmt.Println(i)
    }
}

Her initierer vi løkkevariabelen `i` til 1, setter betingelsen til `i <= 5`, og øker `i` med 1 for hver iterasjon. Resultatet er:

//Output
For løkke:
1
2
3
4
5

La oss se på et annet eksempel. Denne løkken starter med 5 og teller ned til 1. Løkken fortsetter så lenge løkkevariabelen er større enn eller lik 1. For hver iterasjon reduseres løkkevariabelen med 1.

package main

import "fmt"

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

Og resultatet blir som forventet:

//Output
For løkke:
5
4
3
2
1

Hva er omfanget til løkkevariabelen?

Løkkevariabelens omfang er begrenset til selve «for»-løkkeblokken. Dette betyr at den ikke kan brukes utenfor løkken.

For å bekrefte dette, la oss prøve å aksessere verdien til `i` utenfor løkken:

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

Som forventet får vi en feilmelding som sier at `i` er udefinert:

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

Uendelig «for»-løkke i Golang

Kan vi skape uendelige «for»-løkker i Golang? Svaret er ja, absolutt!

Når vi ser på hvordan en «for»-løkke fungerer:

  • Løkken vil fortsette å kjøre så lenge betingelsen er sann.
  • Når betingelsen blir usann, avsluttes løkken.
  • Dette betyr at hvis betingelsen aldri blir usann, vil vi ha en uendelig løkke.

Det er også mulig å bruke en «for»-løkke uten initialisering, betingelse eller oppdatering, og dette gir ikke en syntaksfeil. Derfor kan en uendelig løkke lages ved å bruke en «for»-konstruksjon som dette:

package main
import "fmt"
func main() {
    for {
       fmt.Println("kjører...")
    }
}
//Output
kjører...
kjører...
kjører...
kjører...
kjører...
//og det fortsetter i det uendelige!

I dette eksemplet setter vi variabelen `num` til 5. Betingelsen for løkken er `num > 0`. Derfor vil løkken kjøre så lenge num er større enn 0.

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

Siden verdien til `num` aldri endres, vil betingelsen alltid være sann, og løkken vil fortsette i det uendelige!

//Output
5
5
5
5
5
5
//og det fortsetter i det uendelige!

Siden Golang kun har «for»-løkken, kan vi bruke den til å simulere «while»- og «do-while»-løkker. La oss se hvordan det gjøres!

Simulere «while»-løkke med «for»-løkke

En «while»-løkke har vanligvis denne formen:

// initialiser løkkevariabel
while (betingelse){
  // kode som skal utføres
  // oppdater løkkevariabel
}

Som vi så tidligere, kan vi lage en uendelig «for»-løkke slik:

for {
    //den enkleste uendelige løkken
}

For å etterligne en «while»-løkke, kan vi modifisere «for»-løkken slik at den bare inneholder en betingelse:

// initialiser løkkevariabel
for betingelse {
  // kode som skal utføres
  // oppdater løkkevariabel
}

Her er en «while»-løkke som tilsvarer den første «for»-løkken vi skrev:

package main
import "fmt"
func main() {
    fmt.Println("Simulere while-løkke")
    num := 5
    for num > 0 {
        fmt.Println(num)
        num--
    }
}
//Output
Simulere while-løkke
5
4
3
2
1

Simulere «do-while»-løkke med «for»-løkke

Hvis du har erfaring med C eller liknende språk, vet du at en «do-while»-løkke har følgende struktur:

// initialiser løkkevariabel
do {
// kode som skal utføres
// oppdater løkkevariabel
} while(betingelse);

Den viktigste forskjellen mellom «while»- og «do-while»-løkker er at «while»-løkken sjekker betingelsen før løkken kjører, mens «do-while»-løkken sjekker betingelsen etter løkken har kjørt.

Dette betyr at i en «while»-løkke vil ikke koden i løkken bli utført hvis betingelsen er usann fra starten. I en «do-while»-løkke vil koden derimot alltid bli utført minst én gang, selv om betingelsen er usann.

For å emulere en «do-while»-løkke, kan vi gjøre følgende:

  • Lag en uendelig «for»-løkke.
  • Bruk en if-setning med den riktige betingelsen for å avslutte løkken.

La oss si at du ønsker å skrive en «do-while»-løkke der koden skal utføres så lenge `num` er mindre enn 0. Du kan da skrive en «for»-løkke og avslutte den hvis `num` er større enn eller lik 0.

package main
import "fmt"
func main() {
    fmt.Println("Simulere do-while-løkke")
    num := 5
    for {
        fmt.Println("løkken kjører...")
        if num >= 0 {
            break
        }
    }
}

💡 Merk at å kjøre løkken så lenge `num` er mindre enn 0, og å avslutte løkken hvis `num` er større enn eller lik 0 er ekvivalente betingelser.

Selv om betingelsen `num > 0` i utgangspunktet er usann (num er 5), vil løkken kjøre en gang og simulere en «do-while»-løkke.

//Output
Simulere do-while-løkke
løkken kjører...

Gå gjennom arrays ved bruk av «for»-løkke

Når du går gjennom arrays i Golang med en «for»-løkke og `range`, har du tilgang til både indeksen og verdien på hvert element. Dette ligner på `enumerate`-funksjonen i Python.

Her definerer vi en array av heltall kalt `numArray`, og bruker en «for»-løkke for å gå gjennom den:

package main
import "fmt"
func main() {
    fmt.Println("Går gjennom en array")
    numArray := []int{3, 7, 0, 10, 8, 9}
    for idx, num := range numArray {
        fmt.Println("På indeks", idx, ": ", num)
    }
}

Som du ser, kan vi aksessere både indeksen og elementet på hver indeks samtidig:

//Output
Går gjennom en array
På indeks 0 :  3
På indeks 1 :  7
På indeks 2 :  0
På indeks 3 :  10
På indeks 4 :  8
På indeks 5 :  9

Bruk av `defer` i Golang «for»-løkke

I Golang kan du bruke nøkkelordet `defer` for å utsette funksjonskall.

Dette er spesielt nyttig for ressursopprydding og feilhåndtering, men det kan også være nyttig å vite hvordan `defer` fungerer i en «for»-løkke. La oss se hva som skjer når vi bruker `defer` inne i en «for»-løkke for å utsette kall til `Println()`-funksjonen.

package main
import "fmt"
func main() {
    fmt.Println("For løkke:")
    num := 5
    for i := 1; i <= num; i++ {
        defer fmt.Println(i)
    }
}

💬 Når et funksjonskall blir utsatt, blir det lagt til i en stakk og utført i LIFO-rekkefølge (Last In, First Out). Denne utførelsen skjer først etter at funksjonen som inneholder `defer`-setningen returnerer.

Dette betyr at `fmt.Println(5)` blir utført først og `fmt.Println(1)` blir utført sist:

//Output
For løkke:
5
4
3
2
1

Konklusjon

Her er en oppsummering av det du har lært i denne artikkelen:

  • I Golang lager du «for»-løkker ved hjelp av syntaksen: `for initialisering; betingelse; oppdatering { //løkkekropp }`.
  • Kontrollflyten i en «for»-løkke er enkel. Løkkevariabelen initialiseres én gang, betingelsen bestemmer om løkkekroppen skal kjøres, og oppdateringen endrer løkkevariabelen etter hver iterasjon.
  • Omfanget til en løkkevariabel er begrenset til løkkekroppen.
  • Selv om Golang bare har en «for»-løkke, kan du simulere atferden til «while»- og «do-while»-løkker ved å bruke «for»-løkker.
  • Andre bruksområder for «for»-løkker inkluderer å gå gjennom arrays og utsette funksjonskall ved bruk av `defer`.

Neste skritt er å utforske hvordan du kan bruke «for»-løkker i Python. Lykke til med læringen! 🎉