Middle
Τι είναι κανάλι στο Go; Ποιοι τύποι καναλιών υπάρχουν; Πώς διαφέρουν τα buffer-μεταφορτωμένα από τα μη buffer-μεταφορτωμένα;
sobes.tech AI
Απάντηση από AI
Ένα κανάλι στο Go είναι ένας τύπος δεδομένων που χρησιμοποιείται για τη μετάδοση τιμών μεταξύ goroutines, διασφαλίζοντας συγχρονισμό και ανταλλαγή δεδομένων.
Τύποι καναλιών:
- Χωρίς buffer κανάλια — δεν έχουν εσωτερικό buffer, η αποστολή μπλοκάρει μέχρι ο παραλήπτης να διαβάσει την τιμή.
- Με buffer κανάλια — έχουν εσωτερικό buffer σταθερού μεγέθους, και η αποστολή μπλοκάρει μόνο αν το buffer είναι γεμάτο.
Διαφορές:
- Στα κανάλια χωρίς buffer, ο αποστολέας και ο παραλήπτης πρέπει να είναι έτοιμοι ταυτόχρονα για αποστολή/λήψη, διασφαλίζοντας αυστηρό συγχρονισμό.
- Στα κανάλια με buffer, ο αποστολέας μπορεί να τοποθετήσει πολλαπλές τιμές στο buffer χωρίς να περιμένει τον παραλήπτη, μέχρι το buffer να γεμίσει.
Παράδειγμα δημιουργίας και χρήσης buffer καναλιού:
ch := make(chan int, 2) // buffer για 2 στοιχεία
ch <- 1
ch <- 2
// ch <- 3 // μπλοκάρει μέχρι να ελευθερωθεί χώρος
fmt.Println(<-ch) // 1
fmt.Println(<-ch) // 2