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