Junior
Qual é a diferença entre canais com buffer e canais sem buffer em Go?
sobes.tech IA
Resposta da IA
Os canais não bufferizados requerem que o envio e a receção de dados ocorram de forma síncrona. O remetente fica bloqueado até que o destinatário esteja pronto para aceitar os dados, e vice-versa. O seu tamanho de buffer é zero.
Os canais bufferizados têm um tamanho de buffer finito. O remetente fica bloqueado apenas se o buffer estiver cheio, e o destinatário se estiver vazio.
// Canal não bufferizado
unbufferedChan := make(chan int)
// Canal bufferizado com tamanho de buffer de 5
bufferedChan := make(chan int, 5)
| Característica | Canal não bufferizado | Canal bufferizado |
|---|---|---|
| Tamanho do buffer | 0 | > 0 |
| Sincronização | Interação síncrona | Assíncrona se o buffer não estiver cheio/vazio |
| Bloqueio do remetente | Até que o destinatário receba | Até que o buffer esteja cheio |
| Bloqueio do destinatário | Até que o remetente envie | Até que o buffer seja esvaziado |
Os canais não bufferizados são usados para sincronizar goroutines e garantir que as mensagens não sejam perdidas. Os canais bufferizados são usados para reduzir bloqueios, permitindo que o remetente continue a trabalhar enquanto o destinatário ainda não está pronto, ou vice-versa.