Sobes.tech
Middle+

Ποιος πρέπει να κλείσει το κανάλι - ο συγγραφέας ή ο αναγνώστης;

sobes.tech AI

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

Στο Go, το κανάλι πρέπει να κλείνει από τον αποστολέα (sender), όχι από τον δέκτη (receiver). Το κλείσιμο του καναλιού σηματοδοτεί ότι δεν θα αποσταλούν περαιτέρω τιμές, και οι αναγνώστες μπορούν να τερματίσουν σωστά την ανάγνωση αν ανιχνεύσουν ότι το κανάλι είναι κλειστό.

Αν ο αναγνώστης κλείσει το κανάλι και ο αποστολέας συνεχίσει να προσπαθεί να στείλει, αυτό θα προκαλέσει ένα panic. Επομένως, η ευθύνη για το κλείσιμο του καναλιού ανήκει σε αυτόν που το γράφει.

Παράδειγμα:

ch := make(chan int)
func() {
    defer close(ch) // ο αποστολέας κλείνει το κανάλι
    for i := 0; i < 5; i++ {
        ch <- i
    }
}()

for val := range ch {
    fmt.Println(val) // διαβάζει μέχρι να κλείσει
}