想法是在片中具有可变数量的通道,将通过通道接收的每个值推入单个通道,并在最后一个输入通道关闭后关闭该输出通道。这样的事情,但对于多个渠道来说,要超过两个:
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
情况,这是很好的(编辑:看起来,“,ok”的存在使select语句成为非阻塞状态,并且循环毕竟是繁忙的。但是出于示例的目的,就好像将代码阻止一样)。是否可以通过任意数量的输入通道来实现相同的功能?显然,这可以通过将片段对成对减少到单个通道来完成,但如果可能的话,我将对更简单的解决方案更感兴趣。
我相信这段代码可以满足您的需求。我已经更改了签名,以便清楚地知道输入和输出仅应用于一个方向的通信。请注意,添加了一个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)
} ()
}
我给自己写了一个实用程序来将列表分成给定大小的批次。我只是想知道是否已经有任何apache公共资源用于此。 请让我知道是否有任何现有的实用程序已经相同。
我尝试用以下方法调用三个引用游标参数: 但是listOfObjects只包含cursor1的内容,无法获得cursor2的内容。
嗨,我只是想知道有没有可能创建一个通用类来确认ObserveObject协议,它可以被多个ContentView使用。 如果我能做到这一点,那么我将能够使我的ContentView和Model类完全通用和可重用。 我希望实现的一个例子: 如果我能做到这一点,任何类都可以实现ContentViewModelType,并成为ContentView的模型,使其通用且可重用。举个例子 但是当我尝试初始化C
我有两个版本的应用程序: > 没有广告。 我的应用程序中有订阅。我想在这些应用程序之间共享一个订阅。例如这样一个场景: 用户在应用程序中购买带有广告的订阅,然后购买没有广告的应用程序。我想将第一个应用程序中的订阅分享给第二个应用程序。有没有可能使用标准的谷歌账单库?
我有一个具有多个列的 spark 数据帧,其中一个指标列数据类型为字符串格式。此列数据如下所示,我需要将其转换为多个列。我尝试使用火花rdd映射函数,它显示了一个类型值错误。 架构:列1, 列 2, 度量字符串 示例数据:
我正在使用Jasper生成PDF报告。在jrxml文件中,我可以读取单个属性文件作为一个资源包,但这里我需要读取2个属性文件来生成报告作为一个双语(两种语言标签,一种是英语标签,另一种是本地语言标签)报告。是否可以在JasperReport中使用多个属性文件。还是有其他办法可以做到这一点?