前面的章节创建的都是无缓冲通道 ( 创建是不指定管道的容量 )。使用无缓冲通道往里面装入数据时,装入方将被阻塞,直到另外通道在另外一个 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")
}