30-closing-channel

//  关闭通道表示不再会有值传递给它,这对于与通道的接收器进行通信完成非常有用。

package main

import "fmt"

func main() {
	jobs := make(chan int, 5) // 通道jobs在main goroutine与worker goroutine之间通讯,当没有jobs之后将关闭通道
	done := make(chan bool)

	// 这里是worker goroutine
	go func() {
		for {
			// 不断的从通道中获取值
			j, more := <-jobs // 在这种特殊的二值形式中,如果通道已经关闭且其中的值都已经被接收,那么more将会接收到false值
			if more {
				fmt.Println("received job", j)
			} else {
				fmt.Println("received all jobs")
				done <- true // 完成所有操作后通过done通道来发出通知
				return
			}
		}
	}()

	for j := 0; j < 3; j++ { // 发送3个job到jobs通道中,然后把通道关闭
		jobs <- j
		fmt.Println("send job", j)
	}

	close(jobs)
	fmt.Println("send all jobs")

	<-done
}
上次修改: 10 January 2020