2017-12-14 4 views
1

毎時1時間の値を正確に返す関数を作成しようとしています。それより下のコードは私が今までに得たものですが、私が取ることができるよりよいアプローチはありますか?毎時の値を正確に返す関数

func main() { 
    for { 
      t := time.Now() 
      if t.Minute() == 00 { 
       fmt.Println("Hello World!") 
      } 
      time.Sleep(1 * time.Minute) 
     } 
    } 
+0

は、なぜあなただ​​けの時間寝ると 'fmt.Println()'たびに実行されません。これらの要件を

、このコードは、タスクのでしょうか?それでは、条件付きですら必要ない。それが「良い」アプローチだとは言いませんが、探しているコードがあれば、必要なコードが少なくて済みます。 – Lansana

+0

それは「より良い」ものになるでしょうか?よりシンプルなコード、少ないリソース使用量、より正確なタイミングを探していますか? – Adrian

+0

より正確なタイミングが私の主な目標です。私はその時間に正確に実行したいです。 –

答えて

3

時間パッケージAfterFuncの機能を使用することができます。

time.AfterFunc(time.Hour * 1, func() { 
    // Do something! 
}) 

それは、そのStopメソッドを使用してコールをキャンセルするために使用することができますタイマーを返します。最初の呼び出しでは、残りの時間を次の時間までに計算する必要があります。その結果、すべての呼び出しは必要に応じて1時間ごとに行われます。

0

分秒で正確に処理を開始する場合は、0を入力してから、1時間に切り捨てることは少し難解です(Go)。

タイミングに関するすべての保証を持っているので、時間がビットを毎回シフト条件少なくとも(例えばtime.Sleep(d)は、少なくとも時間のd期間にわたってスリープ;ない正確d)。

func main() { 
    timer := time.NewTimer(nextDelay()) 
    for { 
     <-timer.C 
     timer.Reset(nextDelay()) 
     time.Sleep(time.Minute * 59) // the task, or you could do more tricks with channels 
    } 
} 

func nextDelay() time.Duration { 
    now := time.Now() 
    return truncateHour(now).Add(time.Hour).Sub(now) 
} 

func truncateHour(t time.Time) time.Time { 
    t = t.Truncate(time.Minute * 30) 
    if t.Minute() > 0 { 
     t = t.Add(time.Minute * -1).Truncate(time.Minute * 30) 
    } 
    return t 
} 
関連する問題