Golang Command命令模式任务调度示例

命令模式通过封装请求实现任务调度,Go中定义Command接口与具体命令,结合Scheduler定时执行,解耦任务注册与执行逻辑,支持灵活扩展。

golang command命令模式任务调度示例

在Go语言中,命令模式(Command Pattern)是一种行为设计模式,它将请求封装为对象,从而使你可以用不同的请求、队列或日志来参数化其他对象。结合任务调度系统,命令模式可以很好地实现任务的注册、执行与管理。

命令模式核心结构

命令模式通常包含以下几个部分:

Command接口:定义执行操作的方法,如Execute()具体命令:实现Command接口,持有接收者并调用其方法Receiver:真正执行任务的对象Invoker:调用命令的对象,比如调度器Client:创建命令并绑定接收者

基本命令接口与任务实现

我们先定义一个通用的Command接口,并实现几个具体任务:

立即学习“go语言免费学习笔记(深入)”;

package main

import ("fmt""time")

// Command 接口type Command interface {Execute()}

// 打印消息的接收者type PrintReceiver struct {Message string}

func (p *PrintReceiver) Print() {fmt.Println("打印:", p.Message, " | 时间:", time.Now().Format("15:04:05"))}

// 发送邮件命令type SendEmailCommand struct {Receiver *PrintReceiver}

func (c *SendEmailCommand) Execute() {c.Receiver.Message = "发送用户通知邮件"c.Receiver.Print()}

// 备份数据库命令type BackupDBCommand struct {Receiver *PrintReceiver}

func (c *BackupDBCommand) Execute() {c.Receiver.Message = "正在备份数据库"c.Receiver.Print()}

任务调度器实现

接下来我们构建一个简单的调度器,支持定时执行注册的命令:

立即学习“go语言免费学习笔记(深入)”;

type Scheduler struct {    commands []Command    interval time.Duration}

func NewScheduler(interval time.Duration) *Scheduler {return &Scheduler{commands: make([]Command, 0),interval: interval,}}

func (s *Scheduler) AddCommand(cmd Command) {s.commands = append(s.commands, cmd)}

func (s *Scheduler) Start() {ticker := time.NewTicker(s.interval)go func() {for range ticker.C {for _, cmd := range s.commands {cmd.Execute()}}}()}

使用示例

最后是主函数中的调度使用方式:

立即学习“go语言免费学习笔记(深入)”;

func main() {    receiver := &PrintReceiver{}
scheduler := NewScheduler(3 * time.Second)scheduler.AddCommand(&SendEmailCommand{Receiver: receiver})scheduler.AddCommand(&BackupDBCommand{Receiver: receiver})fmt.Println("任务调度已启动...")scheduler.Start()// 防止主程序退出select{}

}

运行结果会每隔3秒依次输出:

打印: 发送用户通知邮件 | 时间: 10:30:01打印: 正在备份数据库 | 时间: 10:30:01

这个例子展示了如何使用命令模式解耦任务定义与执行逻辑,同时通过调度器统一管理多个任务的周期性执行。你可以扩展支持延迟执行、任务取消、错误重试等功能。

基本上就这些,结构清晰且易于维护。

以上就是Golang Command命令模式任务调度示例的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1413397.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月16日 07:12:12
下一篇 2025年12月16日 07:12:28

相关推荐

  • Golang如何使用享元模式共享对象实例

    享元模式通过工厂管理共享对象,避免重复创建,节省内存。示例中气球形状为内部状态(共享),颜色和坐标为外部状态(传入),相同形状只创建一次,提升性能。 在 Golang 中使用享元模式共享对象实例,核心是通过一个工厂来管理并复用已创建的对象,避免重复创建相同或相似的对象,从而节省内存和提升性能。享元模…

    好文分享 2025年12月16日
    000
  • Golang Flyweight享元模式对象复用实践

    享元模式通过共享内部状态减少内存开销,Go以结构体和接口实现:TextStyle为享元对象,StyleFactory用map缓存实例,getKey生成唯一键,确保相同样式不重复创建;字符渲染场景中,十万字符复用有限样式,显著降内存。并发时需加锁保护map,外部状态如坐标由客户端传入,不存于享元内。 …

    2025年12月16日
    000
  • Golang HTTP客户端请求重试机制实战

    答案:在Go中为HTTP客户端添加重试机制可提升服务稳定性,应基于错误类型判断重试条件,如网络失败和5xx错误可重试,4xx错误通常不重试。通过封装RetryClient结构体,在Do方法中实现重试逻辑,利用循环控制重试次数,对5xx状态码或连接错误进行重试,并采用指数退避策略(1s, 2s, 4s…

    2025年12月16日
    000
  • 理解Go语言中零大小结构体指针的比较行为

    本文深入探讨了Go语言中零大小结构体(zero-sized struct)指针在接口比较时的特殊行为。当匿名函数返回`&fake{}`(其中`fake`是空结构体)时,尽管每次调用看似返回新实例,但其指针在接口比较时可能被判断为相等。文章将详细解释Go语言的接口和指针比较规则,特别是针对零大…

    2025年12月16日
    000
  • Go App Engine Go语言开发环境与生产环境识别指南

    本文旨在解决go app engine应用中区分开发环境与生产环境的常见问题。传统上,开发者可能尝试使用`os.getenv(“server_software”)`,但该方法可能因sdk版本更新而失效。文章将介绍并推荐使用官方提供的`appengine.isdevappser…

    2025年12月16日
    000
  • Web.go 内部重定向:处理表单验证失败的优雅实践

    在 `web.go` 应用中,处理表单验证失败等场景时,无需使用 `http.redirect` 发送外部重定向。通过直接修改 `web.context` 中的请求方法为 `get`,然后调用目标处理函数,可以实现高效且无缝的内部请求重处理,避免不必要的 http 状态码响应和客户端跳转,从而优化用…

    2025年12月16日
    000
  • 切片slice传参是值类型还是指针类型

    切片传参是值传递,传递的是包含指针、长度和容量的切片头副本。由于副本中的指针仍指向原底层数组,因此修改元素会直接影响原切片;但扩容或重新赋值仅改变副本的指针或长度,不会影响原切片。 Go语言中,切片(slice)传参是值传递,但传递的是切片头的副本,不是指针类型。 切片的本质是结构体 切片在底层是一…

    2025年12月16日
    000
  • Golang微服务容器化部署与自动化运维实践

    Golang微服务通过Docker多阶段构建生成轻量镜像,结合Kubernetes实现服务编排与健康检查,利用CI/CD流水线自动化测试、构建、推送镜像并部署至K8s,借助Helm管理多环境配置,同时集成结构化日志、Prometheus监控与Grafana告警,确保系统可观测性与高可用。 微服务架构…

    2025年12月16日
    000
  • Golang开发环境迁移与备份恢复技巧

    备份GOPATH、Go Modules缓存和工具链配置;2. 导出go env环境变量并保存;3. 通过tools.go文件批量恢复开发工具;4. 同步编辑器配置,确保私有模块权限与代理设置正确。 Go开发环境的迁移与备份恢复,核心在于依赖管理、模块缓存和工具链配置的一致性。只要处理好GOPATH、…

    2025年12月16日
    000
  • Golang控制语句if用法与逻辑处理

    Go语言中if语句用于条件控制,支持初始化语句、多分支判断与逻辑运算符组合。基本语法为if条件{代码块},花括号必需;可使用else if实现多条件分支,程序按序执行首个匹配分支;支持if前的初始化语句(如if x := f(); x > 0 {}),变量作用域限于后续块;常用&&am…

    2025年12月16日
    000
  • Golang类型反射与动态类型判断实战

    Go语言通过reflect包实现运行时类型反射,利用reflect.Type和reflect.Value可动态获取类型信息与值,适用于处理未知类型数据、序列化等场景。示例展示如何通过TypeOf和ValueOf获取变量类型与值,结合Kind()和Name()进行类型判断,并根据不同类型执行相应操作。…

    2025年12月16日
    000
  • golang值类型与指针在类型转换时的限制

    Go禁止值类型与指针类型直接转换,且不支持不同指针类型间强制转换,即使底层类型相同;只能通过unsafe.Pointer实现底层指针转换,但存在安全风险;同时方法接收者类型影响接口实现,*T的方法可被T自动继承,反之则不行。 在 Go 语言中,值类型和指针类型的转换受到严格的规则限制,理解这些限制对…

    2025年12月16日
    000
  • Golang Mediator组件交互中介者模式示例

    中介者模式通过引入中介者对象解耦多个组件间的直接通信,Go语言中利用接口和组合实现该模式。以聊天室为例,用户发送消息由中介者ChatRoom统一转发,避免用户间直接引用,降低耦合。User组件通过Mediator接口与ChatRoom交互,新增用户只需注册即可参与通信,扩展性强。该模式适用于事件总线…

    2025年12月16日
    000
  • Golang如何使用log记录日志

    答案:Go标准库log包提供基础日志功能,通过log.Print输出信息,SetPrefix设置前缀,SetFlags配置时间、文件等格式,SetOutput重定向到文件,默认输出到stderr,支持Fatal和Panic级别,适用于简单场景。 Go语言标准库中的log包提供了简单而有效的日志记录功…

    2025年12月16日
    000
  • Golang结构体嵌套与匿名字段使用

    结构体嵌套通过组合实现代码复用,匿名字段可提升内部字段和方法以简化访问并避免命名冲突,适用于共享字段、实现接口及构建复杂配置,体现Go“组合优于继承”的设计哲学。 在Go语言中,结构体嵌套与匿名字段是实现代码复用和构建复杂数据结构的核心机制,它们通过“组合”而非传统“继承”的方式,让类型能够自然地拥…

    2025年12月16日
    000
  • 在 Go 语言中正确设置函数参数类型

    本文旨在帮助 Go 语言初学者理解如何在 Go 函数中正确定义参数类型。通过一个简单的加法函数示例,详细解释了参数类型声明的语法,并提供了两种等效的写法。同时,强调了类型声明的重要性,并推荐了官方教程资源,助力读者快速掌握 Go 语言基础。 在 Go 语言中,函数参数的类型声明是至关重要的,它告诉编…

    2025年12月16日
    000
  • Web.go 内部请求转发:从 POST 到 GET 的高效实践

    本文探讨了在 web.go 框架中,如何高效处理表单提交后将用户重定向到同一页面的场景。针对传统 `http.redirect` 可能导致中间页面显示的问题,文章提出了一种通过修改请求方法并直接调用目标处理函数进行内部转发的优化方案,从而实现无缝的用户体验,避免了不必要的外部重定向。 在 Web 开…

    2025年12月16日
    000
  • Go语言中切片指针的预分配与填充:惯用方法解析

    本文深入探讨了在go语言中如何以惯用的方式预分配和填充包含指针的切片。通过分析`make`函数对切片长度和容量的影响,以及`append`操作的行为,文章指出了常见的误区。我们提供了两种主要的解决方案:一是通过直接索引来填充已预设长度的切片,二是利用`make`函数预设容量并结合`append`操作…

    2025年12月16日
    000
  • Go语言子字符串的内存管理与高效复制:避免潜在的内存泄露

    go语言中的子字符串操作默认不分配新内存,而是共享原始字符串的底层数据。这种机制虽然高效,但可能导致垃圾回收器无法释放不再需要的原始大字符串内存,引发内存泄露。本文将深入探讨这一机制,并提供一种惯用且高效的方法——通过转换为字节切片再转回字符串,实现子字符串的独立复制,从而优化内存管理。 Go语言中…

    2025年12月16日
    000
  • Golang 文件IO同步与异步操作优化

    Go语言通过同步阻塞IO配合缓冲和Goroutine可实现高效文件操作:1. 使用bufio减少系统调用;2. 预分配文件空间优化写入;3. Goroutine+Channel模拟异步IO;4. 结合mmap、O_DIRECT等系统调用提升性能。 Go语言中文件IO操作默认是同步阻塞的,虽然标准库没…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信