Sobes.tech
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.