Middle
O que é um canal em Go? Quais são os tipos de canais? Como diferenciam-se os canais com buffer dos sem buffer?
sobes.tech IA
Resposta da IA
Um canal em Go é um tipo de dado usado para transmitir valores entre goroutines, garantindo sincronização e troca de dados.
Tipos de canais:
- Canais sem buffer — não têm buffer interno, e o envio bloqueia até que o receptor leia o valor.
- Canais com buffer — têm um buffer interno de tamanho fixo, e o envio só bloqueia se o buffer estiver cheio.
Diferenças:
- Nos canais sem buffer, o remetente e o destinatário devem estar prontos ao mesmo tempo para enviar/receber, garantindo sincronização estrita.
- Nos canais com buffer, o remetente pode colocar vários valores no buffer sem esperar pelo destinatário, até que o buffer fique cheio.
Exemplo de criação e uso de um canal com buffer:
ch := make(chan int, 2) // buffer de 2 elementos
ch <- 1
ch <- 2
// ch <- 3 // bloqueia até que haja espaço
fmt.Println(<-ch) // 1
fmt.Println(<-ch) // 2