Sobes.tech
Junior — Middle

Care este diferența dintre un canal cu buffer și unul fără buffer în contextul interacțiunii între goroutines?

sobes.tech AI

Răspuns de la AI

Un canal fără buffer (canal nebufferizat) blochează expeditorul până când receptorul citește valoarea, și invers — receptorul se blochează până apare o valoare. Acest lucru asigură sincronizarea între goroutines.

Un canal cu buffer (canal bufferizat) are un buffer intern de dimensiune fixă. Expeditorul poate trimite mai multe valori consecutiv fără a se bloca, până când bufferul se umple. Receptorul poate citi valorile din buffer fără a aștepta expeditorul, dacă bufferul nu este gol.

Exemplu:

ch := make(chan int)        // fără buffer
chBuf := make(chan int, 2)  // cu buffer de 2 elemente

// ch <- 1  // se va bloca dacă nu există receptor
chBuf <- 1 // nu se va bloca până când bufferul se umple

Astfel, canalele cu buffer permit gestionarea sincronizării într-un mod mai flexibil și pot îmbunătăți performanța, reducând numărul de blocări.