Middle
O que se pode e o que não se pode fazer com segurança de fluxo em canais em Go?
sobes.tech IA
Resposta da IA
Pode-se:
- Enviar e receber dados. Cada leitura e escrita num canal é uma operação atómica.
- Fechar o canal. O encerramento indica que a transmissão de dados terminou.
- Usar o operador
selectpara interação não bloqueante com múltiplos canais. - Utilizar canais com buffer e sem buffer para diferentes cenários de sincronização.
Não se pode:
- Fechar um canal a partir de várias goroutines simultaneamente sem sincronização adicional. Isto pode causar um pânico.
- Fechar um canal que já está fechado. Isto também causará um pânico.
- Enviar dados para um canal fechado. Isto provocará um pânico.
- Esperar por uma leitura de um canal nulo (não inicializado). Isto bloqueará a goroutine.
- Esperar por uma escrita num canal nulo (não inicializado). Isto bloqueará a goroutine.
Exemplo de uso de canais:
// Criar um canal sem buffer para int
messages := make(chan int)
// Goroutine para enviar dados
go func() {
messages <- 1 // Enviar 1 para o canal
messages <- 2 // Enviar 2 para o canal
close(messages) // Fechar o canal após o envio
}()
// Ler dados do canal
firstMessage := <-messages
secondMessage := <-messages
// A leitura de um canal fechado devolve o valor zero e a flag ok=false
value, ok := <-messages