go 语言利用管道实现并发打印的例子

示例概述

前面的章节创建的都是无缓冲通道 (  创建是不指定管道的容量 )。使用无缓冲通道往里面装入数据时,装入方将被阻塞,直到另外通道在另外一个 goroutine 中被取出。同样,如果通道中没有放入任何数据,接收方试图从通道中获取数据时,同样也是阻塞。发送和接收的操作是同步完成的。

利用管道实现并发打印的例子

package main

// 打印函数
func pOut(channel chan int) {
	for {
		data := <-channel
		if data == -1 {
			break
		}
		println(data)
	}
}

func main() {
	// 创建管道
	chanel := make(chan int)

	// 开启协程接收管道值 [ 此处会产生阻塞等待管道有数据 ]
	go pOut(chanel)

	// 发送管道值
	// 开启协程接收管道值
	for i := 0; i < 10; i++ {
		chanel <- i
	}
	// 通知并发协程退出
	chanel <- -1

	// 主程序结束
	println("main end")
}