go并发模式

九路
• 阅读 563

一、生成器

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)
    }
}
点赞
收藏
评论区
推荐文章
徐小夕 徐小夕
3年前
这些经典的前端基础算法题, 你会做几道?
之前因为工作原因接触了很多有意思的算法知识,为了巩固大家的算法基础和编程能力,笔者总结了8道算法题,供大家学习参考.接下来我们来看看题目.1.有一个数组arra1,a2,a3,b1,b2,b3,c1,c2,c3...,通过算法将数组进行拆分,转化为如下格式的数组a1,b1,c1,a2,b2,c2,a3,
凯特林 凯特林
3年前
JS - 用 for 循环实现常见的数组迭代方法
常见的数组迭代方法有很多种,比如some,filter,map等等,底层也都可以用for来实现,我们来康一康。somejsconstsome(arr,fn)for(leti0;i<arr.length;i)if(fn(arri,i,arr))re
徐小夕 徐小夕
3年前
这些经典的前端基础算法题, 你会做几道?
之前因为工作原因接触了很多有意思的算法知识,为了巩固大家的算法基础和编程能力,笔者总结了8道算法题,供大家学习参考.接下来我们来看看题目.1.有一个数组arra1,a2,a3,b1,b2,b3,c1,c2,c3...,通过算法将数组进行拆分,转化为如下格式的数组a1,b1,c1,a2,b2,c2,a3,
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
这些JS工具函数够你用到2020年底了
前言活不多说,自己平时搜集的干货函数奉上。干货函数找出数字在数组中下一个相邻的元素let i  "";let rr  ;const name  (n, arr1)    let num  Number(n);    for (let i  0; i < arr1.length; i)         const elemen
Stella981 Stella981
3年前
CentOS6.7 i686上安装JDK7
内核版本:root@heima01javaunameaLinuxheima012.6.32573.el6.i6861SMPThuJul2312:37:35UTC2015i686i686i386GNU/Linux发行版本:root@heima01java
Stella981 Stella981
3年前
LeetCode 5561. 获取生成数组中的最大值
文章目录1\.题目2\.解题1\.题目给你一个整数n。按下述规则生成一个长度为n1的数组nums:nums00nums11当2<2i<n时,nums2inumsi
Stella981 Stella981
3年前
SpringBoot2 学习10 Controller接收参数的方式
地址传值@PathVariable获取路径参数。即url/{id}这种形式。?传值@RequestParam获取查询参数。即url?name这种形式用注解@RequestParam绑定请求参数到方法入参当请求参数username不存在时会有异常发生,可以通过设置属性requiredfalse解决,例如:@R
Easter79 Easter79
3年前
SpringBoot2 学习10 Controller接收参数的方式
地址传值@PathVariable获取路径参数。即url/{id}这种形式。?传值@RequestParam获取查询参数。即url?name这种形式用注解@RequestParam绑定请求参数到方法入参当请求参数username不存在时会有异常发生,可以通过设置属性requiredfalse解决,例如:@R
Stella981 Stella981
3年前
Python编程之数据结构与算法练习_011
练习内容:1.创建一个类,实现优先级队列功能。2.使用优先级队列求解IPO问题。IPO问题:输入:参数1:正数数组costs;参数2:正数数组profits;参数3:正数k;参数4,正数mcosts\i\表示i号项目的花费;profits\i\表示i号项目在扣除花费之后还能挣到的钱;k表示你不能并行,只能