前面的例子创建的都是无缓冲通道。使用无缓冲通道往里面装入数据时,装入方将被阻塞,直到另外通道在另外一个 goroutine 中被取出。同样,如果通道中没有放入任何数据,接收方试图从通道中获取数据时,同样也是阻塞。发送和接收的操作是同步完成的。
龙泉网站建设公司成都创新互联,龙泉网站设计制作,有大型网站制作公司丰富经验。已为龙泉千余家提供企业网站建设服务。企业网站搭建\成都外贸网站建设公司要多少钱,请找那个售后服务好的龙泉做网站的公司定做!
下面通过一个并发打印的例子,将 goroutine 和 channel 放在一起展示它们的用法。
package main import ( "fmt" ) func printer(c chan int) { // 开始无限循环等待数据 for { // 从channel中获取一个数据 data := <-c // 将0视为数据结束 if data == 0 { break } // 打印数据 fmt.Println(data) } // 通知main已经结束循环(我搞定了!) c <- 0 } func main() { // 创建一个channel c := make(chan int) // 并发执行printer, 传入channel go printer(c) for i := 1; i <= 10; i++ { // 将数据通过channel投送给printer c <- i } // 通知并发的printer结束循环(没数据啦!) c <- 0 // 等待printer结束(搞定喊我!) <-c }
运行代码,输出如下:
1
2
3
4
5
6
7
8
9
10
代码说明如下:
本例的 设计模式就是典型的生产者和消费者。生产者是第 37 行的循环,而消费者是 printer() 函数。整个例子使用了两个 goroutine,一个是 main(),一个是通过第 35 行 printer() 函数创建的 goroutine。两个 goroutine 通过第 32 行创建的通道进行通信。这个通道有下面两重功能。
网页标题:创新互联GO教程:Go语言并发打印(借助通道实现)
文章源于:http://www.csdahua.cn/qtweb/news29/12529.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网