Junior — Middle
Qual é a diferença entre um canal com buffer e um canal sem buffer no contexto da interação entre goroutines?
sobes.tech IA
Resposta da IA
Um canal sem buffer (canal não bufferizado) bloqueia o remetente até que o destinatário leia o valor, e vice-versa — o destinatário fica bloqueado até que um valor apareça. Isso garante a sincronização entre as goroutines.
Um canal com buffer (canal bufferizado) possui um buffer interno de tamanho fixo. O remetente pode enviar vários valores consecutivos sem se bloquear, até que o buffer se encha. O destinatário pode ler valores do buffer sem esperar pelo remetente, se o buffer não estiver vazio.
Exemplo:
ch := make(chan int) // sem buffer
chBuf := make(chan int, 2) // com buffer de 2 elementos
// ch <- 1 // ficará bloqueado se não houver destinatário
chBuf <- 1 // não ficará bloqueado até que o buffer encha
Assim, canais com buffer permitem gerenciar a sincronização de forma mais flexível e podem aumentar o desempenho, reduzindo o número de bloqueios.