在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会在处理完最后一个元素后立即结束。