go定时任务
Time
NewTimer
package main
import (
"fmt"
"time"
)
func cronTimer() {
fmt.Println("start=", time.Now().Format("20060102-15:04:05"))
duration := time.Second * 3
t := time.NewTimer(duration)
<-t.C
fmt.Println("end=", time.Now().Format("20060102-15:04:05"))
fmt.Println("====================================================")
fmt.Println("start=", time.Now().Format("20060102-15:04:05"))
t2 := time.NewTimer(time.Second * 3)
go func() {
<-t2.C
}()
stopFlag := t2.Stop()
if stopFlag {
fmt.Println("end=", time.Now().Format("20060102-15:04:05"))
}
fmt.Println("====================================================")
fmt.Println("start=", time.Now().Format("20060102-15:04:05"))
<-time.After(time.Second * 2)
fmt.Println("end=", time.Now().Format("20060102-15:04:05"))
fmt.Println("====================================================")
taskChan := make(chan bool, 1)
time.AfterFunc(time.Second*3, func() {
taskChan <- true
})
for {
select {
case <-taskChan:
fmt.Printf("taskEnd=%s\n", time.Now().Format("20060102-15:04:05"))
return
default:
fmt.Println("blocked=" + time.Now().Format("20060102-15:04:05"))
time.Sleep(time.Second * 2)
}
}
}
func main() {
cronTimer()
}

NewTicker
package main
import (
"errors"
"fmt"
"time"
)
type taskFunc func() error
type ticker struct {
t *time.Ticker
f taskFunc
}
func createTicker(duration int, fn taskFunc) *ticker {
if duration <= 0 {
panic(errors.New("invalid duration"))
}
return &ticker{
t: time.NewTicker(time.Duration(duration) * time.Second),
f: fn,
}
}
func (tk *ticker) run() {
for {
select {
case <-tk.t.C:
err := tk.f()
if err != nil {
return
}
default:
}
}
}
func (tk *ticker) stop() {
tk.t.Stop()
}
func cronTicker() {
t := time.NewTicker(time.Second)
defer t.Stop()
counter := 0
for v := range t.C {
t.Reset(time.Second)
func(v time.Time) {
fmt.Printf("start%v-(%T)=%v\n", counter, v, v.Format("20060102-15:04:05"))
time.Sleep(time.Second * 2)
fmt.Printf("end%v-(%T)=%v\n", counter, v, v.Format("20060102-15:04:05"))
}(v)
counter++
if counter >= 4 {
break
}
}
fmt.Println("===========================================")
t2 := createTicker(1, func() error {
fmt.Println("running=" + time.Now().Format("20060102-15:04:05"))
return nil
})
t2.run()
defer t2.stop()
fmt.Println("程序结束...")
fmt.Println("===========================================")
}
func main() {
cronTicker()
}

cron
go get github.com/robfig/cron/v3@v3.0.0
package main
import (
"errors"
"fmt"
"github.com/robfig/cron/v3"
"time"
)
func cronRobfig() {
location, _ := time.LoadLocation("Asia/Shanghai")
c := cron.New(cron.WithSeconds(), cron.WithLocation(location))
defer c.Stop()
cronStr := "*/1 * * * * ?"
c.AddFunc(cronStr, func() {
fmt.Println("1=" + time.Now().Format("20060102-15:04:05"))
})
c.AddFunc(cronStr, func() {
fmt.Println("2=" + time.Now().Format("20060102-15:04:05"))
})
c.Start()
entries := c.Entries()
for _, v := range entries {
fmt.Println(v.ID, v.Prev, v.Next, v.Valid(), v.Job)
}
select {}
}
func main() {
cronRobfig()
}

文档
[1] https://studygolang.com/pkgdoc
[2] https://pkg.go.dev/search?q=cron
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具