Junior — Middle
Πώς να προσδιορίσετε ποιο από τα goroutines θα ολοκληρώσει τη δουλειά με το κανάλι;
sobes.tech AI
Απάντηση από AI
Στο Go, δεν είναι δυνατή η άμεση προσδιορισμός ποια goroutine έκλεισε ένα κανάλι, καθώς τα κανάλια δεν περιέχουν πληροφορίες σχετικά με το ποιος τα κλείνει. Ωστόσο, συνήθως χρησιμοποιείται μια συμφωνία:
- Η goroutine που γράφει στο κανάλι είναι υπεύθυνη για το κλείσιμό του.
- Οι goroutines που διαβάζουν λαμβάνουν ένα σήμα κλεισίματος μέσω του δεύτερου παραμέτρου κατά την ανάγνωση:
value, ok := <-ch. Ανok == false, το κανάλι είναι κλειστό.
Για να καταλάβετε ποια goroutine έκλεισε το κανάλι, μπορείτε να χρησιμοποιήσετε πρόσθετους μηχανισμούς, όπως αποστολή δομημένων μηνυμάτων με αναγνωριστικά μέσω του καναλιού ή χρήση ξεχωριστών καναλιών σήματος ή context (context.Context) για συντονισμό.
Παράδειγμα:
ch := make(chan int)
// Goroutine που γράφει και κλείνει το κανάλι
go func() {
defer close(ch)
ch <- 1
}()
// Goroutine που διαβάζει
go func() {
for v := range ch {
fmt.Println(v)
}
fmt.Println("Το κανάλι έκλεισε")
}()
Σε αυτό το παράδειγμα, η πρώτη goroutine κλείνει το κανάλι. Για να γνωρίζετε ρητά ποιος το έκλεισε, μπορείτε να προσθέσετε καταγραφή ή να χρησιμοποιήσετε πρόσθετα κανάλια σήματος.