go语言异步交叉输出abc


func consume() {
    ch:=make(chan string,30)
    wg:= sync.WaitGroup{}
    wg.Add(1)
    go func() {
        for{
            if len(ch)==30{
                break
            }
            if len(ch)%3==0{
                ch<-"a"
            }
        }
        defer wg.Done()

    }()
    wg.Add(1)
    go func() {
        for{
            if len(ch)==30{
                break
            }
            if len(ch)%3==1{
                ch<-"b"
            }
        }
        defer wg.Done()
    }()

    go func() {
        for{
            if len(ch)%3==2{
                ch<-"c"
            }
            if len(ch)==30{
                break
            }
        }
        defer wg.Done()
    }()

    wg.Wait()
    close(ch)
    for i:=1;i<=30;i++{
        fmt.Printf("%v",<-ch)
        if i%3==0{
            fmt.Println()
        }
    }
}