golang有多种设计模式,其中fan-in模式比较常见,也经常使用。fan-in模式是从多个管道读取输入,汇总到一个channel输出。
示例:
package main
import (
“fmt”
“math/rand”
“time”
)
func main() {
c := fanIn(boring(1), boring(2))
for i := 0; i < 5; i++ {
fmt.Println(<-c)
}
}
func fanIn(input1, input2 <-chan int) <-chan int {
c := make(chan int)
go func() {
for {
c <- <-input1 }
}()
go func() {
for {
c <- <-input2 }
}()
return c
}
func boring(msg int) <-chan int {
c := make(chan int)
go func() {
for i := 0; ; i++ {
c <- msg*1000 + i
time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond)
}
}()
return c
}
输出结果:
1000
2000
2001
1001
2002
小结: fan-in模式,fan-out模式数据基本模式,是用来做汇聚或者发散用的,比如proxy场景下使用,使用go channel模式一定要注意性能问题。
其中本文中仅介绍了一下扇入模式,对应的 扇出 模式就是发散,感兴趣的可以自行尝试下即可。
更多内容请关注头条号每日编程,每天进步一点。