实际输出: main done
期望输出:有bug !main done
package main
import (
"fmt"
"sync"
)
func main() {
ch2 := make(chan int, 1000)
var wg sync.WaitGroup
go testThreadSate01(ch2, &wg)
go testThreadSate02(ch2, &wg)
go testThreadSate03(ch2, &wg)
go func() {
for {
select {
case res := <-ch2:
if res == 28 {
break
}
case resGt := <-ch2:
if resGt > 28 {
fmt.Println("有bug !")
break
}
default:
}
}
}()
wg.Wait()
fmt.Println("main done")
}
func testThreadSate03(ch chan int, wg *sync.WaitGroup) {
defer wg.Done()
wg.Add(1)
for j := 21; j <= 30; j++ {
ch <- j
}
}
func testThreadSate01(ch chan int, wg *sync.WaitGroup) {
defer wg.Done()
wg.Add(1)
for j := 0; j <= 10; j++ {
ch <- j
}
}
func testThreadSate02(ch chan int, wg *sync.WaitGroup) {
defer wg.Done()
wg.Add(1)
//time.Sleep(1 * time.Microsecond)
for j := 11; j <= 20; j++ {
ch <- j
}
}
有疑问加站长微信联系(非本文作者)

实际上你的协程可能来不及执行wg.Add(1)主程就退出了,而且你的go func() {}是个死循环只不过你的主程没有去等待这个协程才没有卡住
嗯,理解,有什么补救办法吗,我改了另外一种方式,
这样吧。。
break
跳出的是select
,不是for
循环;select
会随机执行满足条件的语句,感觉case resGt := <-ch2:
有概率一次都不执行,然后程序卡住。完整版
完整优化wgDone传值版