go并发模式

九路 等级 54 0 0
标签:

一、生成器

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)
    }
}
收藏
评论区

相关推荐

【Golang】Goland使用介绍
goland介绍 Goland官方地址:http://www.jetbrains.com/go/(http://www.jetbrains.com/go/) goland安装 下载 Windows下载地址:https://download.jetbrains.com/go/goland2018.2.1.exe(https://download
Go语言开发的利与弊
Go 语言有多火爆?国外如 Google、AWS、Cloudflare、CoreOS 等,国内如七牛、阿里等都已经开始大规模使用 Go 语言开发其云计算相关产品。在 Go 语言的使用过程中,需要注意哪些 Yes 和 But? 最近,我们使用 Go 语言编写了一个 API,Go 语言是一种开源编程语言,2009 年由 Google 推出。在使用 Go 进行开
go 语言资源整理
Awesome GitHub Topic for Go(https://links.jianshu.com/go?tohttps%3A%2F%2Fgithub.com%2Ftopics%2Fgolang) Awesome Go(https://links.jianshu.com/go?tohttps%3A%2F%2F
知乎从Python转为Go,是不是代表Go比Python好?
众所周知,知乎早在几年前就将推荐系统从 Python 转为了 Go。于是乎,一部分人就说 Go 比 Python 好,Go 和 Python 两大社区的相关开发人员为此也争论过不少,似乎,谁也没完全说服谁。 知乎从Python转为Go,是不是代表Go比Python好?我认为,各有优点,谁也取代不了谁,会长期共存! “由 Python 语言转向 Go 语言
go语言开发入门:GO 开发者对 GO 初学者的建议
以促进 India 的 go 编程作为 GopherConIndia 承诺的一部分。我们采访了 40 位 Gophers(一个 Gopher 代表一个 GO 项目或是任何地方的 GO 程序员),得到了他们关于 GO 的意见。如果你正好刚刚开始 go 编程,他们对于我们一些问题的答案可能会对你有非常有用。看看这些。应该做:通读 the Go standard
Go 语言编程 — go mod 依赖包管理
目录 == ### 文章目录 * 目录 * go mod 依赖包管理 * 使用 go mod go mod 依赖包管理 ============ go mod 是 Golang 1.11 版本引入的依赖包管理工具。其中,Golang 对 Modules 的定义:Modules 是相关 Go Packages 的集合,是源代码交换和版本控制
Go文档支持
Go文档查看帮助很方便,主要可以通过以下两种方式查看 第一种,Go本地运行(参考:#Go语言安装#)起来后,References下面: * Package Go标准函数库说明。 * Command Go工具说明。 * Language Specification Go官
gh
gh-ost实战运用 ========== 一、安装步骤 ------ **1、环境** go版本:1.10.3 gh-ost版本:1.0.46 **2、安装go语言** # 安装go依赖包 yum install bison ed gawk gcc libc6-dev make -y #
go mod常用命令
开启Go module =========== go env ![](https://oscimg.oschina.net/oscnet/up-a2c46b6c3712f7a7e580445e593fe387a19.png) tips: 请使用go 1.13+版本 重点关注参数 ------ 开启go mod go en
go环境变量配置 (GOROOT和GOPATH)的区别和含义
<div id="myeditor" class="content article-entry"> <p>GOROOT就是go的安装路径</p><p>在~/.bash\_profile中添加下面语句:</p><p>GOROOT=/usr/local/go</p><p>export GOROOT</p><p>当然, 要执行go命令和go工具, 就要配置go的可
go遇到的坑
******GO配置:****** ================= GOROOT:go的安装路径:C:\\Go GOPATH:go命令安装的包存放的路径,这里放在%GOROOT%\\gocode GOROOT是不用配置环境变量就可以用的,但是GOPATH要配置才能用,如果没有配置的话默认是在%{USER}%\\go文件夹下。 GOPATH可以配置
vs code 下安装golang支持
1)安装gocode go get -u -v github.com/nsf/gocode 2)安装godef go get -u -v github.com/rogpeppe/godef 3)安装golint go get -u -v github.com/golang/lint/golint 4)安装go-find-references g
Golang查缺补漏(一)
### [Go语言高级编程(Advanced Go Programming)](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fbooks.studygolang.com%2Fadvanced-go-programming-book%2F) [Go语言高级编程(Advanced G
Sqlserver 事务处理模板
USE StuDB GO /****** Object: StoredProcedure [dbo].[proc_live_send_answer_v4] Script Date: 06/20/2017 14:44:26 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENT
Tus和go
前言 -- 现如今,分布式文件系统可谓是琳琅满目,多种多样,有hdfs,gfs,zfs,fastdfs,go-fastdfs等,怎么选择合适自己的分布式文件系统呢?在这篇文章中,我们不讲……额,我只想表达一下我在研究go-fastdfs过程中踩的坑。 go-fastdfs ---------- 首先,什么是go-fastdfs?是fastdfs的弟弟吗