這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
package mainimport ( "fmt" "time")func main() { requests := make(chan int, 5) for i := 1; i <= 2; i++ { requests <- i } close(requests) limiter := time.Tick(time.Millisecond * 200) for req := range requests { //會迴圈兩次,前面往requests channel中發送了兩個值 <-limiter //執行到這裡,需要隔 200毫秒才繼續往下執行,time.Tick(timer)上面已定義 fmt.Println("request", req, time.Now()) } burstyLimiter := make(chan time.Time, 3) for i := 0; i < 3; i++ { burstyLimiter <- time.Now() //這裡burstyLimiter channel 連續發送了三次值 } go func() { for t := range time.Tick(time.Second * 2) { burstyLimiter <- t // 這裡往burstyLimiter channel 迴圈發送time.Tick } }() burstyRequests := make(chan int, 5) for i := 1; i <= 5; i++ { burstyRequests <- i <-burstyLimiter //前三次沒有速度限制,會直接列印出後面的println的內容 fmt.Println("request", i, time.Now()) } close(burstyRequests) for req := range burstyRequests { <-burstyLimiter //繼續接收burstyLimiter值,除了前三次,後面的都是time.Tick進行速度限制,2秒列印一次,直到此次迴圈結束 fmt.Println("request", req, time.Now()) }}
注,把time.Tick(time.Second)中的值改為秒會更容易查看效果