CodeFun Go

通道的关闭操作

当所有数据都已经发送并且也没有更多数据要发送时,我们可以关闭这个通道(chan)。

内置函数 close 可以关闭通道。这意味着我们不能再向通道发送数据了。

在示例中,我们创建了一个 jobs 通道和一个 done 通道。

done 通道用于在协程中使用阻塞接收(<-done)的方式等待其它协程执行完毕。

在工作协程中,使用 job, more := <-jobs 从 jobs 通道接收数据,如果 jobs 通道关闭,则第二个值 more 等于 false。

package main

import "fmt"

func main() {
    jobs := make(chan int, 5)
	done := make(chan bool)

    go func() {
		for {
			job, more := <-jobs
			if more {
				fmt.Println("received job ", job)
			} else {
				fmt.Println("received all jobs")
				done <- true
                return
			}
		}
	}()

	for i := 0; i <= 3; i++ {
		jobs <- i
		fmt.Println("sent job", i)
	}
	close(jobs)
	fmt.Println("sent all jobs")

	<-done
}
sent job 0
sent job 1
sent job 2
sent job 3
sent all jobs
received job  0
received job  1
received job  2
received job  3
received all jobs