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
}

您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站大部分内容收集于互联网,如果有侵权内容、不妥之处,请联系删除。敬请谅解!

  Previous post go 的反射
Next post   数组分配内存空间连续

  关于博主【WANG-FEiHU】

Duplicate
-----------Complicate
--------------------------Appreciate
----------------------------------------[Fate]
-----------------------------------------------Elevate

三人行 有吾师

-------------花有重开日 梦无止境时-------------

  分类目录

  monitor(TD)

生命要得到丰盛的收获,必需阳光;同时,也需要“雨”的浇灌。

如真 如假 如可分身饰演自己 会将心中的温柔 献出给你唯有的知己

如痴 如醉 还盼你懂珍惜自己 有天即使分离我都想你 我 真的想你

红雨瓢泼泛起了回忆怎么潜

你的选择是做或不做,但不做就永远不会有机会。

爱是有多荒唐 ,恨也能醉人肠。

人生应该树立目标,否则你的精力会白白浪费。

种下一颗树最好的时间是十年前,其次是现在。

你我亦无他 唯手熟尔

只要锦绣山河在,物质名利还复来

https://www.bilibili.com/video/av35928275/?p=391

如若不是为了一个人,谁肯枯守一座城。城市和爱情,总是有着这样那样的关系。我们会因为一个人,去到那座城,因为那是一座爱的城;我们也会因为一个人,离开一座城,那是一座绝望的伤城。