Sobes.tech
Junior — Middle

Ποια είναι η διαφορά μεταξύ ενός καναλιού με buffer και ενός χωρίς buffer στο πλαίσιο της αλληλεπίδρασης μεταξύ goroutines;

sobes.tech AI

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

Ένα κανάλι χωρίς buffer (unbuffered channel) μπλοκάρει τον αποστολέα μέχρι ο παραλήπτης να διαβάσει την τιμή, και το αντίστροφο — ο παραλήπτης μπλοκάρει μέχρι να εμφανιστεί μια τιμή. Αυτό διασφαλίζει συγχρονισμό μεταξύ των goroutines.

Ένα κανάλι με buffer (buffered channel) έχει έναν εσωτερικό buffer σταθερού μεγέθους. Ο αποστολέας μπορεί να στείλει αρκετές τιμές διαδοχικά χωρίς να μπλοκάρει, μέχρι ο buffer να γεμίσει. Ο παραλήπτης μπορεί να διαβάσει τιμές από τον buffer χωρίς να περιμένει τον αποστολέα, αν ο buffer δεν είναι άδειος.

Παράδειγμα:

ch := make(chan int)        // χωρίς buffer
chBuf := make(chan int, 2)  // με buffer 2 στοιχείων

// ch <- 1  // θα μπλοκάρει αν δεν υπάρχει παραλήπτης
chBuf <- 1 // δεν θα μπλοκάρει όσο ο buffer δεν γεμίζει

Έτσι, τα κανάλια με buffer επιτρέπουν πιο ευέλικτο έλεγχο συγχρονισμού και μπορούν να βελτιώσουν την απόδοση, μειώνοντας τον αριθμό των μπλοκαρισμάτων.