packagemain
import(
    "fmt"
    "math/rand"
    "sync"
    "time"
)
funcmain() {
    ashleyMsg := make(chanstring)
    brianMsg := make(chanstring)
    exit := make(chanstruct{})
    rand.Seed(time.Now().UnixNano())
    varwg sync.WaitGroup
    gofunc() {
        numJob := rand.Intn(10)
        fmt.Println("number of jobs:", numJob)
        fori := 0; i < numJob; i++ {
            wg.Add(2)
            gofunc() {
                deferwg.Done()
                time.Sleep(time.Duration(rand.Intn(10)) * time.Millisecond)
                ashleyMsg <- "hi"
            }()
            gofunc() {
                deferwg.Done()
                time.Sleep(time.Duration(rand.Intn(10)) * time.Millisecond)
                brianMsg <- "what's up"
            }()
        }
        wg.Wait()
        close(exit)
    }()
    for{
        select{
        caseres1 := <-ashleyMsg:
            fmt.Println("ashley:", res1)
        caseres2 := <-brianMsg:
            fmt.Println("brian:", res2)
        case<-exit:
            fmt.Println("chat ended")
            return
        default:
            fmt.Println("...")
            time.Sleep(time.Millisecond)
        }
    }
}