Go併發模式之橋接channel(bridge channel)

作爲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 這樣好嗎??
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章