golang并发范式(2)生成器

《Go语言核心编程》

package main

import (
    "fmt"
    "math/rand"
)

func GenerateIntA(done chan struct{})chan int{
    ch :=make(chan int,5)
    go func(){
        Lable:
            for{
                select {
                case ch<-rand.Int():
                case <-done:
                    break Lable
                }
            }
        close(ch)
    }()

    return ch
}

func GeneraterIntB(done chan struct{})chan int{
    ch :=make(chan int,5)
    go func() {
        Lable:
            for{
                select {
                case ch<-rand.Int():
                case <-done:
                    break Lable
                }
            }
        close(ch)
    }()
    return ch
}

func GeneraterInt(done chan struct{})chan int{
    ch:=make(chan int)
    send:=make(chan struct{})
    go func() {
        Label:
            for{
                select {
                case ch<- <-GenerateIntA(send):
                case ch<- <-GeneraterIntB(send):
                case <-done:
                    send<- struct{}{}
                    send<- struct{}{}
                    break Label
                }
            }
        close(ch)
    }()
    return ch
}

func main(){
    //接收退出信号的chan
    done:=make(chan struct{})

    //启动生成器
    ch:=GeneraterInt(done)

    //获取生成器资源
    for i:=0;i<10;i++{
        fmt.Println(<-ch)
    }

    //停止生产
    done<- struct{}{}

    fmt.Println("stop gernarate")
}