这个想法是在切片中拥有可变数量的通道,将通过它们接收到的每个值推送到单个通道中,并在最后一个输入通道关闭后关闭该输出通道。类似这样,但对于两个以上的通道数:
func multiplex(cin1, cin2, cout chan int) {
n := 2
for {
select {
case v, ok := <-cin1:
if ok {
cout <- v
} else {
n -= 1
}
case v, ok := <-cin2:
if ok {
cout <- v
} else {
n -= 1
}
}
if n == 0 {
close(cout)
break
}
}
}
上面的代码避免了繁忙循环,因为没有default
case,这很好(编辑:看起来“,ok”的存在使得 select 语句非阻塞,并且循环毕竟很忙。但是为了示例,将代码想象成它会阻塞)。使用任意数量的输入通道也可以实现相同类型的功能吗?显然,这可以通过将切片成对减少到单个通道来完成,但如果可能的话,我对更简单的解决方案更感兴趣。
我相信这个片段可以满足您的需求。我更改了签名,以便清楚地表明输入和输出只能用于一个方向的通信。注意添加一个sync.WaitGroup https://golang.org/pkg/sync/#WaitGroup,您需要某种方式让所有输入表明它们已完成,这非常简单。
func combine(inputs []<-chan int, output chan<- int) {
var group sync.WaitGroup
for i := range inputs {
group.Add(1)
go func(input <-chan int) {
for val := range input {
output <- val
}
group.Done()
} (inputs[i])
}
go func() {
group.Wait()
close(output)
} ()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)