亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

以不同的持續時間重復倒計時

以不同的持續時間重復倒計時

Go
繁星coding 2021-12-07 16:36:52
這些“功能”以相同的方式運行,實際上它們的調用方式幾乎相同。該方法被稱為方法表達式,接收者作為第一個參數:var s Square// The method calls.SetSide(5)// is equivalent to the method expression(*Square).SetSide(&s, 5)該SetSide方法也可以用作方法值來滿足函數簽名func(int),而SetSquareSide不能。var f func(int)f = a.SetSidef(9)這是在方法集Square滿足接口的明顯事實之上interface {    SetSide(int)}
查看完整描述

2 回答

?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

如果你愿意,你可以打電話給 sleep


dur := 1 * time.Second

nextDur := 3 * time.Second


for {

    time.Sleep(dur)

    dur, nextDur = nextDur, dur


    ...

}

或者,time.Timer如果需要,可以交替使用 a 中的持續時間select。這是我個人會堅持的,因為您不必擔心由于調度不一致而導致兩個計時器之間的偏移。


dur := 1 * time.Second

nextDur := 3 * time.Second


timer := time.NewTimer(dur)


for {

    select {

    case t := <-timer.C:

        dur, nextDur = nextDur, dur

        timer.Reset(dur)

        ...

    }

    ...

}

或者運行 2 個定時器以較小的間隔偏移


dur1 := 1 * time.Second

dur2 := 3 * time.Second


timer1 := time.NewTimer(dur1)

timer2 := time.NewTimer(dur1 + dur2)


for {

    select {

    case t := <-timer1.C:

        timer1.Reset(dur1 + dur2)

        fmt.Println("timer1:", t)

    case t := <-timer2.C:

        timer2.Reset(dur1 + dur2)

        fmt.Println("timer2:", t)

    }


}

你也可以像最初嘗試的那樣運行交錯的 Tickers,但這需要更多的協調來延遲其中一個的啟動


dur1 := 1 * time.Second

dur2 := 3 * time.Second


ticker1 := time.NewTicker(dur1)

ticker2 := time.NewTicker(dur1 + dur2)


var once sync.Once

delayOnce := func() {

    ticker1.Stop()

    ticker1 = time.NewTicker(dur1 + dur2)

}


for  {

    select {

    case t := <-ticker1.C:

        once.Do(delayOnce)

        fmt.Println("ticker1:", t)

    case t := <-ticker2.C:

        fmt.Println("ticker2:", t)

    }


}


查看完整回答
反對 回復 2021-12-07
?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

一種解決方案是只有 1 個每 5 秒滴答一次的股票代碼。5分鐘加5秒就是61*5秒。所以“周期”是 61 個滴答聲。每個61th刻度是 5 分鐘標記,每個61th+1刻度是 5 秒標記。由于只有一個股票代碼,因此甚至不需要select:


c, count := time.Tick(5*time.Second), 1

for {

    <-c

    count++

    switch count % 61 {

    case 0:

        fmt.Println("5-min mark")

    case 1:

        fmt.Println("5-sec mark")

    }

}

注意:由于count是用 初始化的1,第一個“任務”將是5-min mark,在啟動后 5 分鐘后執行。


另一種解決方案是使用 2 個time.Sleep()調用的序列,第一個是 5 分鐘,第二個是 5 秒:


for {

    time.Sleep(5 * time.Minute)

    fmt.Println("5-min mark")

    time.Sleep(5 * time.Second)

    fmt.Println("5-sec mark")

}

但是這個時間也取決于你執行的任務。所以要么使用第一個解決方案,要么在單獨的 goroutines 中執行任務,這樣它們就不會干擾時間,例如:


for {

    time.Sleep(5 * time.Minute)

    go func () {

        fmt.Println("5-min mark")

    }

    time.Sleep(5 * time.Second)

    go func () {

        fmt.Println("5-sec mark")

    }

}


查看完整回答
反對 回復 2021-12-07
  • 2 回答
  • 0 關注
  • 253 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號