go chan归并的核心代码
comment
// 1 2 3 4 500 v1
// 100 200 300 v2
func Merge(chan1, chan2 <-chan int) <-chan int {
out := make(chan int)
fmt.Println("chan1,chan2", chan1, chan2)
//out := make(chan int,1024) //缓冲 优化效率
go func() {
v1, ok1 := <-chan1
v2, ok2 := <-chan2 //因为会阻塞 所以不存在 有v1然后v2还没到的情况 除非close了 ok2则为false 才会进入下面的处理循环
famous := ""
fmt.Println(v1, ok1, v2, ok2)
for ok1 || ok2 {
//fmt.Println(ok1,ok2,v1,v2)
//如果只有 v1 或者 v1 和 v2 都有 但是v1<v2 那么 v1入结果列
//一般来讲 v1 和v2都是有的 如果只有1者 表示另一个chan已全部处理进入结果列
if !ok2 || (ok1 && v1 <= v2) {
out <- v1
famous = fmt.Sprintf("v1 is %d", v1)
v1, ok1 = <-chan1
} else {
out <- v2
famous = fmt.Sprintf("v2 is %d", v2)
v2, ok2 = <-chan2
}
_ = famous
//log.Println("famous",famous)
}
close(out)
fmt.Println("merge done", time.Now().Sub(starttime))
fmt.Println("close")
}()
return out
}
Tags : 本文未设置标签
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站大部分内容收集于互联网,如果有侵权内容、不妥之处,请联系删除。敬请谅解!