github.com/shuguocloud/go-zero@v1.3.0/core/timex/ticker.go (about) 1 package timex 2 3 import ( 4 "errors" 5 "time" 6 7 "github.com/shuguocloud/go-zero/core/lang" 8 ) 9 10 type ( 11 // Ticker interface wraps the Chan and Stop methods. 12 Ticker interface { 13 Chan() <-chan time.Time 14 Stop() 15 } 16 17 // FakeTicker interface is used for unit testing. 18 FakeTicker interface { 19 Ticker 20 Done() 21 Tick() 22 Wait(d time.Duration) error 23 } 24 25 fakeTicker struct { 26 c chan time.Time 27 done chan lang.PlaceholderType 28 } 29 30 realTicker struct { 31 *time.Ticker 32 } 33 ) 34 35 // NewTicker returns a Ticker. 36 func NewTicker(d time.Duration) Ticker { 37 return &realTicker{ 38 Ticker: time.NewTicker(d), 39 } 40 } 41 42 func (rt *realTicker) Chan() <-chan time.Time { 43 return rt.C 44 } 45 46 // NewFakeTicker returns a FakeTicker. 47 func NewFakeTicker() FakeTicker { 48 return &fakeTicker{ 49 c: make(chan time.Time, 1), 50 done: make(chan lang.PlaceholderType, 1), 51 } 52 } 53 54 func (ft *fakeTicker) Chan() <-chan time.Time { 55 return ft.c 56 } 57 58 func (ft *fakeTicker) Done() { 59 ft.done <- lang.Placeholder 60 } 61 62 func (ft *fakeTicker) Stop() { 63 close(ft.c) 64 } 65 66 func (ft *fakeTicker) Tick() { 67 ft.c <- Time() 68 } 69 70 func (ft *fakeTicker) Wait(d time.Duration) error { 71 select { 72 case <-time.After(d): 73 return errors.New("timeout") 74 case <-ft.done: 75 return nil 76 } 77 }