在应用系统中,常见的的应用场景就是调用一个生成器:生成订单号,序列号,随机数等。
golang goroutine为这种需求提供了强大的武器。
1.简单的生成器
package main import ( "fmt" "math/rand" ) func GenerateIntA()chan int { ch := make(chan int,10) go func(){ for { ch<-rand.Int() } }() return ch } func main(){ ch := GenerateIntA() fmt.Println(<-ch) fmt.Println(<-ch) }
可以使用多路复用技术进行堆积叠加,增加服务能力
可以使用缓冲chan增加服务能力
package main import ( "fmt" "math/rand" ) func GenerateIntA() chan int { ch := make(chan int,10) go func() { for { ch <- rand.Int() } }() return ch } func GenerateIntB() chan int { ch := make(chan int,10) go func() { for { ch <- rand.Int() } }() return ch } func GenerateInt() chan int { ch := make(chan int,20) go func() { for { select { case ch <- <-GenerateIntA(): case ch <- <-GenerateIntB(): } } }() return ch } func main() { ch := GenerateInt() for i := 0; i < 100; i++ { fmt.Println(<-ch) } }
Closechanneltobroadcast 机制实现:
package main import ( "fmt" "math/rand" ) func GenerateIntA(done chan struct{})chan int { ch := make(chan int ) go func(){ Lable: for { select { case ch<-rand.Int(): case <-done: break Lable } } close(ch) }() return ch } func main(){ done :=make(chan struct{}) ch := GenerateIntA(done) fmt.Println(<-ch) fmt.Println(<-ch) close(done) fmt.Println(<-ch) fmt.Println(<-ch) fmt.Println(<-ch) fmt.Println(<-ch) }原文链接:https://www.f2er.com/go/189592.html