FREE

ΕΝΟΤΗΤΑ 8 GO - The for Statement

Στο σημερινό δωρεάν μάθημα GO θα δούμε πως ορίζουμε ένα for loop στην απλή του μορφή και ποια άλλα στοιχεία μπορούμε να προσθέσουμε έτσι ώστε να πάρουμε μια συμπεριφορά ίδια με εκείνη ενός while loop.

Ο πιο συνηθισμένος τρόπος για να επαναλάβουμε μια πράξη πολλαπλές φορές χωρίς να γράψουμε ξανά και ξανά τον ίδιο κώδικα είναι να χρησιμοποιήσουμε ένα for loop. Πιο συγκεκριμένα, ένα for loop μας επιτρέπει να επαναλάβουμε ένα μπλοκ κώδικα για ένα προκαθορισμένο αριθμό επαναλήψεων, ή για όσο η συνθήκη που έχουμε ορίσει παραμένει true.

Στην GO δεν θα βρούμε while loops όπως υπάρχουν σε άλλες γλώσσες. Για αυτό το λόγο, το for loop που μας προσφέρει η GO είναι αρκετά ευέλικτο για να μας δώσει όλες τις δυνατότητες που χρειαζόμαστε κάτω από μια μορφή loop. Πριν ξεκινήσουμε να δούμε το πρώτο μας παράδειγμα, ας δούμε πρώτα από ποια στοιχεία αποτελείται ένα for loop.

for loop general structure

        
for <initial statement>; <condition>; <post statement> {
    <statements>
}

Στο initial statement ορίζουμε συνήθως την μεταβλητή που θα χρησιμοποιηθεί σαν counter από το ίδιο το for loop. Αυτή την ίδια μεταβλητή θα έρθουμε να συγκρίνουμε στον condition. Όσο η συνθήκη επιστρέφει true, τότε το for loop θα συνεχίσει να εκτελείται. Τέλος, στο post ορίζουμε κατά πόσο θέλουμε να αυξάνουμε (ή να μειώνουμε) τον counter. Συνήθως αυξάνουμε τον counter κατά ένα.

Το initial, condition, και post είναι όλα προαιρετικοί όροι για το for loop. Θα μπορούσαμε δηλαδή να γράψουμε ένα for loop σαν και αυτό:


    for {
        <statements>
     }

Ο συγκεκριμένος τρόπος γραφής του for loop δημιουργεί ένα infinite loop που δεν πρόκειται ποτέ να σταματήσει γιατί εξ ορισμού πάντα θα είναι true.

Ας δούμε όμως ένα απλό παράδειγμα ενός for loop όπου ορίζουμε μια τοπική μεταβλητή μέσα στο for loop, την συγκρίνουμε μέσω μιας απλής συνθήκης και της αλλάζουμε την τιμή σε κάθε επανάληψη. Το for loop σταματάει όταν η συνθήκη γίνει false.

main.go


package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
}


Output


0
1
2
3
4

Όπως ήδη αναφέραμε, όλοι οι όροι του for loop είναι προαιρετικοί. Ας δούμε λοιπόν τώρα ένα δεύτερο παράδειγμα όπου η μεταβλητή του for loop δεν ορίζεται τοπικά αλλά έξω από το loop. Με αυτό τον τρόπο δεν χρειάζεται το initial statement. Επίσης δεν θα χρησιμοποιήσουμε ούτε το Post statement αφού η αύξηση της τιμής γίνεται μέσα στον κώδικα μας.

main.go


package main

import "fmt"

func main() {
    i := 0
    for i < 5 {
        i++
        fmt.Println(i)
    }
}

Output


1
2
3
4
5

Υπάρχουν δύο ακόμα λέξεις κλειδιά που μας βοηθάνε να έχουμε καλύτερο έλεγχο με το for loop – break και continue. Με το continue σταματάμε την εκτέλεση του τρέχοντος loop και ξεκινάμε καινούργιο, ενώ με το break σταματάμε το τρέχον loop και βγαίνουμε έξω από το loop συνεχίζοντας με τον υπόλοιπο κώδικα του προγράμματος μας. Ας δούμε ένα παράδειγμα για το καθένα.

Στο παρακάτω παράδειγμα, δημιουργούμε έναν τυχαίο αριθμό από το 0 έως το 10. Το loop θα προσπεράσει οποιονδήποτε αριθμό είναι πολλαπλάσιο του 3 (ή διαιρείται ακριβώς με το 3). Για να το καταφέρουμε αυτό χρησιμοποιούμε την λέξη continue. Το loop θα εκτελεστεί 5 φορές.

main.go

    
package main

import (
    "fmt"
    "math/rand"
)

func main() {
    for i := 0; i < 5; i++ {
        r := rand.Intn(10)
        if r%3 == 0 {
            fmt.Println("Skip")
            continue
        } else {
            fmt.Println(r)
        }
    }
}
    
    

Output

    
1
7
7
Skip
1
    
    

Τώρα ας αλλάξουμε την λέξη από continue σε break. Στην ουσία αν η τιμή βρεθεί να διαιρείται ακριβώς με το 3 τότε το loop θα σταματήσει εντελώς. Επίσης, αυτός είναι και ο τρόπος με τον οποίο μπορούμε να χρησιμοποιήσουμε το for loop σαν while loop.

main.go


package main

import (
    "fmt"
    "math/rand"
)

func main() {
    for i := 0; i < 5; i++ {
        r := rand.Intn(10)
        if r%3 == 0 {
            fmt.Println("break")
            break
        } else {
            fmt.Println(r)
        }
    }
}
    

Output


1
7
7
break

Υπάρχει μια ακόμα λέξη κλειδί με το όνομα range με την οποία μπορούμε να χρησιμοποιήσουμε τιμές από έναν πίνακα. Επειδή όμως ακόμα δεν έχουμε μιλήσει ούτε για arrays, ούτε για slices αλλά ούτε και για maps, θα δούμε αυτό το παράδειγμα σε μελλοντική ενότητα.