作为channel 消费者 不关心其值来自一系列的channel的事实。这种情况下处理一个充满channel的 channel这种情况很多。
我们可以做的是 : 将充满channel的channel 拆解为一个简单的channel
func main() {
bridge := func(done <-chan interface{}, chanStream <- chan <-chan interface{}) <-chan interface{} {
valStream := make(chan interface{})
go func() {
defer close(valStream)
for{
var stream <-chan interface{}
select{
case maybeStream, ok := <- chanStream:
if ok== false{
return
}
stream = maybeStream
case <-done :
return
}
for val := range orDone(done, stream){
select{
case valStream <- val:
case <-done:
}
}
}
}()
return valStream
}
genVals := func()<-chan <-chan interface{} {
chanStream := make(chan (<-chan interface{}))
go func() {
defer close(chanStream)
for i:=0; i<10;i++{
stream := make(chan interface{}, 1)
stream <- i
close(stream)
chanStream <- stream
}
}()
return chanStream
}
for v := range bridge(nil, genVals()){
fmt.Printf("%v", v)
}
}
分析: 有个问题,一个channel 读取完了 ,再轮到其他channel 这样好吗??