Go 关闭通道

关闭通道的意思是该通道将不再允许写入数据。这个方法可以让通道数据的接受端知道数据已经全部发送完成了。

  1. package main
  2. import "fmt"
  3. // 在这个例子中,我们使用通道jobs在main函数所在的协程和一个数据
  4. // 接收端所在的协程通信。当我们数据发送完成后,我们关闭jobs通道
  5. func main() {
  6. jobs := make(chan int, 5)
  7. done := make(chan bool)
  8. // 这里是数据接收端协程,它重复使用`j, more := <-jobs`来从通道
  9. // jobs获取数据,这里的more在通道关闭且通道中不再有数据可以接收的
  10. // 时候为false,我们通过判断more来决定所有的数据是否已经接收完成。
  11. // 如果所有数据接收完成,那么向done通道写入true
  12. go func() {
  13. for {
  14. j, more := <-jobs
  15. if more {
  16. fmt.Println("received job", j)
  17. } else {
  18. fmt.Println("received all jobs")
  19. done <- true
  20. return
  21. }
  22. }
  23. }()
  24. // 这里向jobs通道写入三个数据,然后关闭通道
  25. for j := 1; j <= 3; j++ {
  26. jobs <- j
  27. fmt.Println("sent job", j)
  28. }
  29. close(jobs)
  30. fmt.Println("sent all jobs")
  31. // 我们知道done通道在接收数据的时候会阻塞,所以在所有的数据发送
  32. // 接收完成后,写入done的数据将在这里被接收,然后程序结束。
  33. <-done
  34. }

运行结果

  1. sent job 1
  2. received job 1
  3. sent job 2
  4. sent job 3
  5. sent all jobs
  6. received job 2
  7. received job 3
  8. received all jobs