golang读取关闭channel遇到的问题/如何优雅关闭channel

DJZhu ·
我个人觉得,是你的思路有问题。 例如这句 go func() { for { select { case v := <-a: c <- v case v := <-b: c <- v } } }() 其实这里可以分成 go func(){ for v := range a{ c <- v } } go func(){ for v := range b{ c <- v } } 他的效果和你 那个是一样的,而且不会出现你说的问题。 其实说白了 select 在golang底层,它也是开go程去处理的,你多少个case它就多少个go程。不要以为select能省go程,这是错误的看法。
#1
更多评论
首先按1楼的方法没问题, 然后select上层的for循环根本就没有break,程序不会正常结束。其次merge之后c没有close。 ``` merge := func(a, b <-chan int) <-chan int { c := make(chan int) go func() { for { select { case v,ok := <-a: if !ok { a = nil } c <- v case v := <-b: if !ok { b = nil } c <- v } if nil == a && nil == b { break } } close(c) }() return c } ``` 建议尽量贴上正确代码,给大家指正确的路,这样才省时省力
#2