网站地图    收藏    合作   
<

快捷菜单 返回顶部

前面的例子创建的都是无缓冲通道。使用无缓冲通道往里面装入数据时,装入方将被阻塞,直到另外通道在另外一个 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 行创建的通道进行通信。这个通道有下面两重功能。

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com