Go语言中是否有用于实现工作计时功能的相关函数或库?
实现方案
核心依赖
仅需两个依赖即可完成开发:
- GUI层直接使用你选定的
Fyne框架 - 计时核心逻辑完全依赖Go标准库
time实现,不需要引入额外第三方计时模块
可运行完整示例
package main import ( "fmt" "time" "fyne.io/fyne/v2" "fyne.io/fyne/v2/app" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/widget" ) // TaskTimer 定义任务计时器结构体 type TaskTimer struct { name string duration time.Duration isRunning bool stopChan chan struct{} updateCallback func() // 计时更新时触发的GUI更新回调 } // Start 启动计时器 func (t *TaskTimer) Start() { if t.isRunning { return } t.isRunning = true t.stopChan = make(chan struct{}) go func() { ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() for { select { case <-ticker.C: t.duration += 1 * time.Second if t.updateCallback != nil { t.updateCallback() } case <-t.stopChan: t.isRunning = false return } } }() } // Stop 停止计时器 func (t *TaskTimer) Stop() { if t.isRunning { close(t.stopChan) } } // Reset 重置计时器 func (t *TaskTimer) Reset() { t.Stop() t.duration = 0 if t.updateCallback != nil { t.updateCallback() } } func main() { myApp := app.New() myWindow := myApp.NewWindow("工作计时工具") var timers []*TaskTimer timerList := container.NewVBox() // 添加新计时器按钮逻辑 addBtn := widget.NewButton("添加新计时器", func() { nameEntry := widget.NewEntry() nameEntry.SetPlaceHolder("输入任务名称") addDialog := widget.NewFormDialog("新建任务", "确认", "取消", []*widget.FormItem{ widget.NewFormItem("任务名称", nameEntry), }, func(ok bool) { if !ok || nameEntry.Text == "" { return } // 初始化新计时器 timer := &TaskTimer{ name: nameEntry.Text, duration: 0, isRunning: false, } // 计时显示标签 timeLabel := widget.NewLabel(fmt.Sprintf("%s: 00:00:00", timer.name)) // 绑定更新回调 timer.updateCallback = func() { h := int(timer.duration.Hours()) m := int(timer.duration.Minutes()) % 60 s := int(timer.duration.Seconds()) % 60 timeLabel.SetText(fmt.Sprintf("%s: %02d:%02d:%02d", timer.name, h, m, s)) } // 启停按钮 startStopBtn := widget.NewButton("启动", func() { if !timer.isRunning { timer.Start() startStopBtn.SetText("停止") } else { timer.Stop() startStopBtn.SetText("启动") } }) // 重置按钮 resetBtn := widget.NewButton("重置", func() { timer.Reset() startStopBtn.SetText("启动") }) // 组装单条计时条目 timerRow := container.NewHBox(timeLabel, startStopBtn, resetBtn) timerList.Add(timerRow) timers = append(timers, timer) }, myWindow) addDialog.Show() }) mainContent := container.NewBorder(nil, nil, nil, addBtn, timerList) myWindow.SetContent(mainContent) myWindow.Resize(fyne.NewSize(500, 400)) myWindow.ShowAndRun() // 退出时停止所有运行中的计时器 for _, t := range timers { t.Stop() } }
关键逻辑说明
- 计时核心用
time.Ticker实现每秒一次的计时累加,通道stopChan用来控制计时协程的退出,避免协程泄露 - 每个计时器绑定
updateCallback回调函数,计时更新时自动触发GUI内容刷新,Fyne原生支持跨协程更新UI组件,不需要额外加锁处理 - 所有启停、重置操作前都会先判断计时器运行状态,避免重复操作导致的逻辑异常
运行步骤
- 先安装Fyne依赖,执行命令:
go get fyne.io/fyne/v2 - 将代码保存为
main.go,执行命令:go run main.go即可启动应用
应用支持多任务同时计时,可自由添加、启停、重置任意计时器。
内容的提问来源于stack exchange,提问作者Jammerinbc
相关产品推荐
相关产品推荐

