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 θα περιμένει (θα μπλοκάρει) μέχρι να εμφανιστούν δεδομένα ή να κλείσει το κανάλι.