go并发模式

九路
• 阅读 195

一、生成器

func messageGen(name string) <-chan string {
    c := make(chan string)
    i := 0
    go func() {
        for {
            time.Sleep(1000 * 1000)
            c <- name + "-" + strconv.Itoa(i)
            i++
        }
    }()

    return c
}


```go

// 方法一:此种方法,可以不必知道具体有多少个chan,参数里面也可以传一个chan的数组,如下面的 fanInSlice
func fanIn(c1, c2 <-chan string) <-chan string {
    m := make(chan string)
    go func() {
        for {
            m <- <-c1
        }
    }()

    go func() {
        for {
            m <- <-c2
        }
    }()

    return m
}

func fanInSlice(channels []<-chan string) <-chan string {
    m := make(chan string)

    // 注意此时有个坑,ch相对于里面的go func ,是共享的,只有一份
    // 所以要copy一份
    // 或者给go func传参数
    for _, ch := range channels {
        //chCopy := ch
        go func(chCopy <-chan string) {
            for {
                m <- <-chCopy
            }
        }(ch)
    }

    return m
}

// 方法二:此种方法,必须知道有几个chan
func fanInBySelect(c1, c2 <-chan string) <-chan string {
    m := make(chan string)
    go func() {
        for {
            select {
            case val := <-c1:
                m <- val
            case val := <-c2:
                m <- val
            }
        }
    }()
    return m
}

func main() {
    c1 := messageGen("service1")
    c2 := messageGen("service2")
    //m := fanIn(c1, c2)

    channels := make([]<-chan string, 0)
    channels = append(channels, c1)
    channels = append(channels, c2)
    m := fanInSlice(channels)
    //m := fanInBySelect(c1, c2)

    for {
        fmt.Println(<-m)
    }
}
点赞
收藏
评论区
推荐文章
徐小夕 徐小夕
1年前
这些经典的前端基础算法题, 你会做几道?
之前因为工作原因接触了很多有意思的算法知识,为了巩固大家的算法基础和编程能力,笔者总结了8道算法题,供大家学习参考.接下来我们来看看题目.1.有一个数组arra1,a2,a3,b1,b2,b3,c1,c2,c3...,通过算法将数组进行拆分,转化为如下格式的数组a1,b1,c1,a2,b2,c2,a3,
徐小夕 徐小夕
1年前
这些经典的前端基础算法题, 你会做几道?
之前因为工作原因接触了很多有意思的算法知识,为了巩固大家的算法基础和编程能力,笔者总结了8道算法题,供大家学习参考.接下来我们来看看题目.1.有一个数组arra1,a2,a3,b1,b2,b3,c1,c2,c3...,通过算法将数组进行拆分,转化为如下格式的数组a1,b1,c1,a2,b2,c2,a3,
Stella981 Stella981
1年前
Linux查看GPU信息和使用情况
1、Linux查看显卡信息:lspci|grepivga2、使用nvidiaGPU可以:lspci|grepinvidia!(https://oscimg.oschina.net/oscnet/36e7c7382fa9fe49068e7e5f8825bc67a17.png)前边的序号"00:0f.0"是显卡的代
Stella981 Stella981
1年前
CentOS6.7 i686上安装JDK7
内核版本:root@heima01javaunameaLinuxheima012.6.32573.el6.i6861SMPThuJul2312:37:35UTC2015i686i686i386GNU/Linux发行版本:root@heima01java
Stella981 Stella981
1年前
Hive SQL50道练习题
建表createtablestudent(s_idstring,s_namestring,s_birthstring,s_sexstring)rowformatdelimitedfieldsterminatedby'\t';createtablecourse(c_idstring,c_namestring,t_i
Stella981 Stella981
1年前
JavaScript中判断数组是否包含某个元素
javascript的Array没有contains方法,有时候这会不方便,contains方法实现很简单可以扩展Array类,如下:写法1.Array.prototype.containsfunction(obj){varithis.length;while(i){
Wesley13 Wesley13
1年前
JS字符串反转
最开始的思路是,先把字符串分割,然后倒序拼接成一个新的字符串。于是有了方法一:varname"MycityisWH";varnameArrname.split('');varresult;varresultStr'';for(vari0,l
Stella981 Stella981
1年前
Golang学习笔记:channel
channelchannel是goroutine之间的通信机制,它可以让一个goroutine通过它给另一个goroutine发送数据,每个channel在创建的时候必须指定一个类型,指定的类型是任意的。使用内置的make函数,可以创建一个channel类型:ch:make(chanint)发送和接
Stella981 Stella981
1年前
SpringBoot2 学习10 Controller接收参数的方式
地址传值@PathVariable获取路径参数。即url/{id}这种形式。?传值@RequestParam获取查询参数。即url?name这种形式用注解@RequestParam绑定请求参数到方法入参当请求参数username不存在时会有异常发生,可以通过设置属性requiredfalse解决,例如:@R
Wesley13 Wesley13
1年前
MySQL优化之BTree索引使用规则
MySQL优化之BTree索引使用规则从一道题开始分析:假设某个表有一个联合索引(c1,c2,c3,c4)以下那个只能使用该联合索引的c1,c2,c3部分explainselect\fromtwherec1'a1'andc2'a2'andc4'a4'andc3'a3';expl
3A网络 3A网络
4个月前
Golang 常见设计模式之选项模式
Golang常见设计模式之选项模式熟悉Python开发的同学都知道,Python有默认参数的存在,使得我们在实例化一个对象的时候,可以根据需要来选择性的覆盖某些默认参数,以此来决定如何实例化对象。当一个对象有多个默认参数时,这个特性非常好用,能够优雅地简化代码。而Go语言从语法上是不支持默认参数的,所以为了实现既能通过默认参数创建对象,又能通过传