030_go语言中的通道关闭

代码演示
package main

import "fmt"

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

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

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

  

代码运行结果

sent job 1
sent job 2
sent job 3
sent all jobs
received job 1
received job 2
received job 3
received all jobs

  

代码解读

  • 将一个通道关闭的话,会给接收方传递一个完成工作的信息,这个特性是很有用的
  • 以上例子,创建了一个jobs通道,并且通过这个通道,给go协程传递任务信息
  • 当jobs通道再没有任务信息给go协程传递时候,我们close掉这个通道
  • 在go协程中,我们利用more这个值来判断通道是否关闭,如果关闭了,那么more的值为false,并且通知给通道done
posted @ 2018-04-14 18:48  Joestar  阅读(417)  评论(0编辑  收藏  举报