Avatar ·

Kann man einen Kanal in Go offen lassen? Konsequenzen und korrekte Praxis

Hallo zusammen! Ich habe gerade angefangen, Go zu lernen, und schreibe einen kleinen Service zur Aufgabenverarbeitung. Ich habe eine Worker-Goroutine, die aus einem Kanal liest und Nachrichten verarbeitet. Mir ist aufgefallen, dass wenn die main-Funktion beendet wird, aber der Kanal offen bleibt – das Programm stürzt nicht ab, es beendet sich einfach leise. Aber ich bin mir nicht sicher, ob das in Ordnung ist. Hier ist ein vereinfachtes Beispiel von dem, was ich mache: ```go package main import "fmt" func worker(tasks <-chan int) { for task := range tasks { fmt.Println("Aufgabe verarbeitet:", task) } } func main() { tasks := make(chan int) go worker(tasks) tasks <- 1 tasks <- 2 tasks <- 3 // Ich schließe den Kanal nicht, und das Programm beendet sich. // Ist das in Ordnung? } ``` Ich habe gelesen, dass der Garbage Collector in Go Kanäle nicht schließt und dass man sie explizit schließen muss. Aber in meinem Beispiel funktioniert das Programm und beendet sich ohne Fehler. Wenn ich `close(tasks)` hinzufüge, beendet sich die Worker-Goroutine sofort nach der Verarbeitung des letzten Elements.