2 回答
TA贡献1886条经验 获得超2个赞
在golang中,可能有两种方式创建ticker,如下所示:
package main
import (
"fmt"
"time"
)
func main() {
//第一种实现方式
ticker1 := time.NewTicker(1 * time.Second)
i := 1
for c := range ticker1.C {
i++
fmt.Println(c.Format("2006/01/02 15:04:05.999999999"))
if i > 5 {
ticker1.Stop()
break
}
}
fmt.Println(time.Now().Format("2006/01/02 15:04:05.999999999"), " 1 Finished.")
//第二种实现方式
i = 1
ticker2 := time.AfterFunc(1*time.Second, func() {
i++
fmt.Println(time.Now().Format("2006/01/02 15:04:05.999999999"))
})
for {
select {
case <-ticker2.C:
fmt.Println("nsmei")
case <-time.After(3 * time.Second):
if i <= 5 {
ticker2.Reset(1 * time.Second)
continue
}
goto BRK
}
BRK:
ticker2.Stop()
break
}
fmt.Println(time.Now().Format("2006/01/02 15:04:05.999999999"), " 2 Finished.")
}
输出:
2016/01/26 16:46:34.261248567
2016/01/26 16:46:35.256381743
2016/01/26 16:46:36.259717152
2016/01/26 16:46:37.260320837
2016/01/26 16:46:38.259312704
2016/01/26 16:46:38.259410752 1 Finished.
2016/01/26 16:46:39.260604274
2016/01/26 16:46:42.261091322
2016/01/26 16:46:45.263136257
2016/01/26 16:46:48.264193517
2016/01/26 16:46:51.265655137
2016/01/26 16:46:53.265722632 2 Finished.
根据执行,第一个比第二个更精确。
在您的情况下,您可以使用time.Time.Sub()计算持续时间,并使用第二种方法执行一次,其余使用第一种方法。
我希望这些对你有帮助!
TA贡献1840条经验 获得超5个赞
下面的代码达到了你的目的。您所要做的就是按照下面 main() 函数中显示的方式调用 ScheduleAlarm()。
package main
import (
"strings"
"strconv"
"fmt"
"time"
)
// A struct for representing time.
type Time struct {
Hh int // Hours.
Mm int // Minutes.
Ss int // Seconds.
}
func main() {
/*
Set the alarm as shown below.
Time must be specified in 24 hour clock format.
Also, pass the callback to be called after the alarm is triggered.
*/
alarm := ScheduleAlarm(Time{23, 28, 0}, func() {
fmt.Println("alarm received")
})
// Do your stuff.
for i := 0; i < 10; i++ {
fmt.Println(i)
time.Sleep(2 * time.Second)
}
// Don't forget to call the below line whenever you want to block.
<-alarm
}
// Call this function to schedule the alarm. The callback will be called after the alarm is triggered.
func ScheduleAlarm(alarmTime Time, callback func() ()) (endRecSignal chan string) {
endRecSignal = make(chan string)
go func() {
timeSplice := strings.Split(time.Now().Format("15:04:05"), ":")
hh, _ := strconv.Atoi(timeSplice[0])
mm, _ := strconv.Atoi(timeSplice[1])
ss, _ := strconv.Atoi(timeSplice[2])
startAlarm := GetDiffSeconds(Time{hh, mm, ss}, alarmTime)
// Setting alarm.
time.AfterFunc(time.Duration(startAlarm) * time.Second, func() {
callback()
endRecSignal <- "finished recording"
close(endRecSignal)
})
}()
return
}
func GetDiffSeconds(fromTime, toTime Time) int {
fromSec := GetSeconds(fromTime)
toSec := GetSeconds(toTime)
diff := toSec - fromSec
if diff < 0 {
return diff + 24 * 60 * 60
} else {
return diff
}
}
func GetSeconds(time Time) int {
return time.Hh * 60 * 60 + time.Mm * 60 + time.Ss
}
希望这可以帮助。
- 2 回答
- 0 关注
- 164 浏览
添加回答
举报