Sobes.tech
Junior — Middle

Πώς συμπεριφέρεται το πρόγραμμα κατά τη χρήση του range για ανάγνωση από ένα κλειστό, μη bufferαρισμένο κανάλι;

sobes.tech AI

Απάντηση από AI

Όταν χρησιμοποιείτε το range για ανάγνωση από ένα κανάλι στο Go, ο βρόχος θα λαμβάνει τιμές από το κανάλι μέχρι να κλείσει. Αν το κανάλι είναι κλειστό και έχουν διαβαστεί όλες οι τιμές, το range θα τερματίσει τον βρόχο.

Για ένα κανάλι χωρίς buffer, λειτουργεί το ίδιο όπως και για ένα με buffer: αν το κανάλι είναι κλειστό, το range δεν μπλοκάρει και βγαίνει από τον βρόχο.

Παράδειγμα:

ch := make(chan int)
func() {
    ch <- 1
    ch <- 2
    close(ch)
}()

for v := range ch {
    fmt.Println(v) // Θα εμφανίσει 1 και 2, και μετά ο βρόχος θα τερματίσει
}

Αν το κανάλι είναι κλειστό, αλλά δεν περιέχει δεδομένα, το range θα τερματίσει αμέσως. Αν το κανάλι δεν είναι κλειστό, αλλά δεν έχει δεδομένα, το range θα περιμένει (θα μπλοκάρει) μέχρι να εμφανιστούν δεδομένα ή να κλείσει το κανάλι.