一、生成器
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)
}
}