Avatar ·

É permitido deixar um canal aberto em Go? Consequências e boas práticas

Olá a todos! Comecei a estudar Go recentemente e estou escrevendo um pequeno serviço para processar tarefas. Tenho uma goroutine worker que lê de um channel e processa as mensagens. Notei que, se a função main termina mas o channel permanece aberto, o programa não quebra — ele simplesmente encerra silenciosamente. Mas não tenho certeza se isso é normal. Aqui está um exemplo simplificado do que estou fazendo: ```go package main import "fmt" func worker(tasks <-chan int) { for task := range tasks { fmt.Println("Tarefa processada:", task) } } func main() { tasks := make(chan int) go worker(tasks) tasks <- 1 tasks <- 2 tasks <- 3 // Não estou fechando o channel, e o programa termina. // Isso é normal? } ``` Li que, em Go, o garbage collector não fecha channels, e que eles precisam ser fechados explicitamente. Mas no meu exemplo, o programa funciona e termina sem erros. Quando adiciono `close(tasks)`, a goroutine worker termina imediatamente após processar o último elemento.