当前位置:首页 > 科技  > 软件

Go事件管理器:简单实现

来源: 责编: 时间:2023-11-28 09:37:20 318观看
导读在编程中,事件管理器是一种常见的工具,用于通过通知来触发操作。在Go语言中,我们可以通过创建事件管理器和监听器来实现事件的处理。本文将介绍一个简单的Go事件管理器的实现,并通过异步改进提高其性能。监听器首先,我们需

在编程中,事件管理器是一种常见的工具,用于通过通知来触发操作。在Go语言中,我们可以通过创建事件管理器和监听器来实现事件的处理。本文将介绍一个简单的Go事件管理器的实现,并通过异步改进提高其性能。Dp728资讯网——每日最新资讯28at.com

监听器

首先,我们需要创建一个监听器。在这个实现中,监听器只是一个接收事件参数的函数。Dp728资讯网——每日最新资讯28at.com

type Listener[T any] func(T)

事件管理器

事件管理器是一个用于管理事件和监听器的结构。它具有两个方法:Add和Run。Add方法用于将新的监听器附加到事件上,而Run方法用于执行事件管理器。Dp728资讯网——每日最新资讯28at.com

type Manager[T any] interface { Add(n string, l Listener[T]) Run()}

抽象事件管理器

为了方便使用,我们可以创建一个抽象事件管理器,它实现了事件管理器接口的一部分通用逻辑。虽然Go语言并不是面向对象的,但我们可以通过模拟来实现类似的效果。Dp728资讯网——每日最新资讯28at.com

type BaseManager[T any] struct { lst map[string][]Listener[T]}func (m *BaseManager[T]) Invoke(n string, args T) { for _, ls := range m.lst[n] {  ls(args) }}func (m *BaseManager[T]) Add(n string, l Listener[T]) { m.lst[n] = append(m.lst[n], l)}

BaseManager提供了Add方法用于添加监听器和Invoke方法用于触发指定事件的监听器。Dp728资讯网——每日最新资讯28at.com

具体事件管理器

下面是一个具体的事件管理器的示例实现:命令事件管理器。该管理器接收用户从控制台输入的命令,并根据命令类型触发相应的事件。Dp728资讯网——每日最新资讯28at.com

type Command struct { Kind string Args []string}type CommandEventManager struct { BaseManager[*Command]}func (m *CommandEventManager) Run() { var (  inp  string  args Command ) fmt.Scanln(&inp) cmd := strings.Split(inp, ":") if l := len(cmd); l == 0 {  m.Invoke("no-command", nil) } else if l > 1 {  args.Args = strings.Split(cmd[1], " ") } args.Kind = cmd[0] m.Invoke("any-command", &args) m.Invoke(args.Kind, &args)}func NewCommandEventManager() Manager[*Command] { return &CommandEventManager{  BaseManager: BaseManager[*Command]{lst: make(map[string][]Listener[*Command])}, }}

Run方法获取用户从控制台输入的命令,并解析命令参数。如果没有命令或者命令参数,则触发"no-command"事件;否则,触发"any-command"事件和具体命令的事件。Dp728资讯网——每日最新资讯28at.com

添加监听器

让我们向命令事件管理器添加一些监听器。Dp728资讯网——每日最新资讯28at.com

func main() { cem := NewCommandEventManager() cem.Add("no-command", func(_ *Command) {  fmt.Println("no command was recieved") }) cem.Add("any-command", func(c *Command) {  fmt.Printf("the %s command was executed", c.Kind) }) cem.Add("sum", func(c *Command) {  a, _ := strconv.Atoi(c.Args[0])  b, _ := strconv.Atoi(c.Args[1])  fmt.Printf("the sum result is: %d", a+b) }) cem.Run()}

在上面的示例中,程序只执行一次,但你可以将其放在一个无限循环中以持续监听命令。Dp728资讯网——每日最新资讯28at.com

异步改进

可以将事件管理器的执行改为异步方式,以提高性能。每次执行事件时,可以将其作为一个goroutine进行处理。甚至可以将每个监听器的执行也放在一个goroutine中,以提高并发性能。Dp728资讯网——每日最新资讯28at.com

通过上述改进,我们可以更好地利用Go语言的并发特性,提高事件处理效率。Dp728资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-34683-0.htmlGo事件管理器:简单实现

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 一文搞懂Go gRPC服务Handler单元测试

下一篇: 十个杀手级VS Code插件

标签:
  • 热门焦点
  • vivo TWS Air开箱体验:真轻 臻好听

    在vivo S15系列新机的发布会上,vivo的最新款真无线蓝牙耳机vivo TWS Air也一同发布,本次就这款耳机新品给大家带来一个简单的分享。外包装盒上,vivo TWS Air保持了vivo自家产
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • 这款新兴工具平台,让你的电脑效率翻倍

    随着信息技术的发展,我们获取信息的渠道越来越多,但是处理信息的效率却成为一个瓶颈。于是各种工具应运而生,都在争相解决我们的工作效率问题。今天我要给大家介绍一款效率
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 自律,给不了Keep自由!

    来源 | 互联网品牌官作者 | 李大为编排 | 又耳 审核 | 谷晓辉自律能不能给用户自由暂时不好说,但大概率不能给Keep自由。近日,全球最大的在线健身平台Keep正式登陆港交所,努力
  • 东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼‍‍‍‍‍‍‍‍‍‍东方甄选创始人俞敏洪带队的“7天甘肃行”直播活动已在近日顺利收官。成立后一
  • 小米MIX Fold 3配置细节曝光:搭载领先版骁龙8 Gen2+罕见5倍长焦

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
Top