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