package Timer

import (
    "fmt"
    "sync"
    "time"
)

type TimerTicket struct {
    wg sync.WaitGroup
    second int //定时执行时间
    replay int //重试次数
}

func NewTimerTicket(second int) *TimerTicket {
    return &TimerTicket{second: second}
}

    t.wg.Add(2)
    go t.ticket()
    go t.timer()
    t.wg.Wait()
}

//使用ticket实现
func (t *TimerTicket) ticket() {
    replay:=t.replay
    ticket := time.NewTicker(time.Second * time.Duration(t.second))
    defer func() {
        t.wg.Done()
        fmt.Println("ticket 结束了")
    }()
Loop:
    for {
        select {
        case <-ticket.C:
            fmt.Println("开始执行 ticket", time.Now(), "replay", replay)
            replay += 1
            if replay >= 5 {
                ticket.Stop()
                break Loop
            }
        }
    }
}

//使用timer实现
func (t *TimerTicket) timer() {
    replay:=t.replay
    ticker := time.NewTimer(time.Duration(t.second) * time.Second)
    defer func() {
        fmt.Println("timer 结束了")
        t.wg.Done()
    }()
Loop:
    for {
        select {
        case <-ticker.C:
            fmt.Println("开始执行 timer", time.Now(), "replay", replay)
            replay += 1
            if replay >= 5 {
                ticker.Stop()
                break Loop
            } else {
                ticker.Reset(time.Duration(t.second) * time.Second)
            }
        }
    }

}