在日常工作和学习中,我们常常需要一个小工具来提醒自己:比如休息眼睛、喝水、开会等。虽然很多软件有提醒功能,但用 Go 写一个轻量级的 命令行定时提醒程序 ,不仅简单实用,还能帮助我们熟悉 时间操作、并发、命令行交互 等关键知识点。
本文将实现一个简易定时提醒程序,支持以下功能:
- 指定提醒时间(如 10 秒后、30 分钟后)
- 提醒时在终端打印提示信息
- 支持多任务提醒
一、程序思路
-
用户通过命令行传入提醒时间和内容,例如:
bashremind -after=10s -msg="喝水提醒" remind -after=1m -msg="开会啦"
-
程序解析参数,使用
time.After
或time.NewTimer
实现延迟提醒。 -
到点后输出提醒信息。
二、代码实现
main.go
:
go
package main
import (
"flag"
"fmt"
"time"
)
func main() {
// 定义命令行参数
after := flag.Duration("after", 10*time.Second, "提醒时间,例如 10s、1m、2h")
msg := flag.String("msg", "时间到啦!", "提醒内容")
flag.Parse()
fmt.Printf("⏳ 已设置提醒: %s 后提醒 -> %s\n", after.String(), *msg)
// 使用定时器
timer := time.NewTimer(*after)
// 等待定时触发
<-timer.C
fmt.Printf("🔔 提醒: %s\n", *msg)
}
三、运行测试
-
10 秒提醒
bashgo run main.go -after=10s -msg="喝水提醒"
输出:
rust⏳ 已设置提醒: 10s 后提醒 -> 喝水提醒 🔔 提醒: 喝水提醒
-
1 分钟提醒
bashgo run main.go -after=1m -msg="开会啦"
输出:
rust⏳ 已设置提醒: 1m0s 后提醒 -> 开会啦 🔔 提醒: 开会啦
四、支持多任务提醒
如果我们想同时设置多个提醒,可以在 flag.Args()
获取额外参数,或者用一个简单的 配置文件 。这里用 goroutine 来并发执行多个提醒。
示例(多个提醒同时执行):
go
package main
import (
"fmt"
"time"
)
type Reminder struct {
After time.Duration
Msg string
}
func main() {
reminders := []Reminder{
{After: 5 * time.Second, Msg: "喝水提醒"},
{After: 10 * time.Second, Msg: "起身走动一下"},
{After: 15 * time.Second, Msg: "开会啦"},
}
for _, r := range reminders {
go func(r Reminder) {
timer := time.NewTimer(r.After)
<-timer.C
fmt.Printf("🔔 提醒: %s\n", r.Msg)
}(r)
}
// 阻塞主程序,否则会直接退出
select {}
}
运行后,程序会在 5s、10s、15s 分别提醒。
五、总结
通过这个案例,我们学习了:
- 如何用
flag
包解析命令行参数 - 使用
time.NewTimer
/time.After
实现延时提醒 - 使用 goroutine 实现多个提醒并发执行
这个简易定时提醒工具非常轻巧,适合平时用来做一些 番茄钟 、喝水提醒 或 会议提醒。