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