Junior
Care este diferența dintre canalele tamponate și cele ne tamponate în Go?
sobes.tech AI
Răspuns de la AI
Canalele fără buffer necesită ca trimiterea și primirea datelor să aibă loc sincron. Trimisul se blochează până când receptorul este gata să accepte datele, și viceversa. Dimensiunea bufferului lor este zero.
Canalele cu buffer au o dimensiune finită a bufferului. Trimisul se blochează doar dacă bufferul este plin, iar receptorul dacă bufferul este gol.
// Canal fără buffer
unbufferedChan := make(chan int)
// Canal cu buffer de dimensiune 5
bufferedChan := make(chan int, 5)
| Caracteristică | Canal fără buffer | Canal cu buffer |
|---|---|---|
| Dimensiune buffer | 0 | > 0 |
| Sincronizare | Interacțiune sincronă | Asincronă dacă bufferul nu este plin/goale |
| Blocarea trimisului | Până când receptorul primește | Până când bufferul se umple |
| Blocarea receptorului | Până când trimisul trimite | Până când bufferul se golește |
Canalele fără buffer sunt folosite pentru sincronizarea goroutine-urilor și pentru a asigura că mesajele nu se pierd. Canalele cu buffer sunt folosite pentru a reduce blocajele, permițând trimisului să continue să lucreze în timp ce receptorul nu este încă gata, sau invers.