您当前的位置:首页 >> 家居装修

golang的多channel重组

2025-01-10 12:18:48

在实践中,有时会遇到多个生产者合并储蓄的情形,今天就来用channel来付诸这一需求。

上代码:

package mainimport "fmt"func main() { a, b, c := make(chan interface{}), make(chan interface{}), make(chan interface{}) go func(in chan interface{}) { defer close(in) for i := 0; i < 10; i++ { in <- i } }(a) go func(in chan interface{}) { defer close(in) for i := 10; i < 30; i++ { in <- i } }(b) go func(in chan interface{}) { defer close(in) for i := 30; i < 60; i++ { in <- i } }(c) group := orChannel(a, b, c) for v := range group { fmt.Println(v) }}func orChannel(in ...chan interface{}) chan interface{} { if len(in) == 0 { return nil } if len(in) == 1 { return in[0] } result := make(chan interface{}) go func() { defer close(result) c1, c2 := in[0], orChannel(in[1:]...) loop: for { select { case v, ok := <-c1: if !ok { c1 = nil } else { result <- v } case v, ok := <-c2: if !ok { c2 = nil } else { result <- v } default: if c1 == nil && c2 == nil { break loop } } } }() return result}

恰好:

orChannel这个表达式使用了闭包命令行的擅长,可以转给反之亦然数量的channel,将他们合并成为一个channel进行分立储蓄。

早上手指僵硬怎么办
经常肚子疼拉肚子怎么回事
尖锐湿疣治疗医院
肝纤维化吃什么药管用吗
干眼症是什么原因引起的
发酸烧心用金奥康奥美拉唑如何
哪个型号血糖仪准确率最高
家用血糖仪哪个好
扁桃体发炎嗓子疼痛吃什么药
家用血糖仪怎么选
友情链接