You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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组件,不需要额外加锁处理
  • 所有启停、重置操作前都会先判断计时器运行状态,避免重复操作导致的逻辑异常

运行步骤

  1. 先安装Fyne依赖,执行命令:go get fyne.io/fyne/v2
  2. 将代码保存为main.go,执行命令:go run main.go即可启动应用

应用支持多任务同时计时,可自由添加、启停、重置任意计时器。

内容的提问来源于stack exchange,提问作者Jammerinbc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:36:05