É 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.