Junior — Middle
Qual é o papel do array dentro do canal e em que cenários é aplicado?
sobes.tech IA
Resposta da IA
Em Go, um canal (channel) é um meio de transmitir dados entre goroutines, garantindo sincronização e troca de mensagens. Dentro do canal, é implementado um buffer — um array de tamanho fixo que armazena os elementos transmitidos através do canal.
O papel do array dentro do canal:
- Bufferização: o array funciona como um buffer que permite ao emissor escrever vários valores no canal sem esperar imediatamente que outro goroutine os receba.
- Assincronismo: o buffer permite desacoplar parcialmente o emissor e o receptor, aumentando o desempenho e reduzindo bloqueios.
Cenários de uso de canais com buffer:
- Quando é necessário suavizar picos de carga, permitindo que o emissor não bloqueie se o receptor estiver temporariamente ocupado.
- Para implementar filas de mensagens de tamanho limitado.
Exemplo de criação de um canal bufferizado com tamanho 3:
ch := make(chan int, 3) // canal com buffer de 3 elementos
ch <- 1 // não bloqueia, pois o buffer não está cheio
ch <- 2
ch <- 3
// Ao tentar enviar o quarto elemento, se ninguém ler, o emissor ficará bloqueado
// ch <- 4
fmt.Println(<-ch) // leitura do canal libera espaço no buffer
Se o canal não for bufferizado (tamanho 0), então não há array interno, e o envio bloqueia até que alguém leia o valor.