Avatar ·

在Go中是否可以保持通道打开?后果与正确实践

大家好!我刚开始学习Go,正在编写一个用于处理任务的小服务。我有一个worker goroutine,它从通道读取并处理消息。我注意到,如果主函数结束但通道保持打开状态——程序不会崩溃,只是安静地退出。但我不确定这是否正常。 以下是我正在做的简化示例: ```go package main import "fmt" func worker(tasks <-chan int) { for task := range tasks { fmt.Println("处理任务:", task) } } func main() { tasks := make(chan int) go worker(tasks) tasks <- 1 tasks <- 2 tasks <- 3 // 我没有关闭通道,程序就结束了。 // 这样做正常吗? } ``` 我读到过,在Go中垃圾回收器不会关闭通道,需要显式关闭它们。但在我的示例中,程序运行并正常结束,没有错误。当我添加`close(tasks)`时,worker goroutine会在处理完最后一个元素后立即结束。