golang事件机制

slclub · · 8158 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

源码地址 https://github.com/slclub/goevents 概述 事件package。 我们可以自由灵活的使用事件,支持串行事件,并行事件; 且可以将串行事件 按定义的模块去触发. 事件函数的自定义参数无限制,但没有返回值。具体执行事件灵活自定义,用On 类函数接口注入到goevents。 可以灵活的绑定事件队列的参数。针对事件去绑定,或者,统一触发事件之前去绑定,或者混合着使用。单个绑定的优先级会更高一些 API English Doc 获取代码到本地 go get github.com/slclub/goevents 使用案例 串行化事件使用案例 ```go import "github.com/slclub/goevents" ev1 := func(args ...interface{}){ //ev1 do something. } ev2 := func(args ...interface{}){ //ev2 do something. } func main() { events := goevents.Classic() //连贯写法 绑定事件及参数 events.Bind("123", "dfd").On("a", ev1) //绑定事件和参数分开写 events.Bind("event2 serial running") events.On("a",ev2) //Trigger //events.Bind(...)//可以在这里绑定全局参数,当有事件绑定参数,这里可以重新绑定,只是不能针对所有串行事件 //按模块名 执行事件队列。无参数 执行所有串行 事件 events.Trigger("a") //触发所有事件,串行,并行的全部触发 //events.Emit() } ``` 并行执行事件使用案例 这里我们直接写main函数即可,害是用 上面的2个事件就可以了,并行执行因为无序,所以直接简化api不做模块化等。 ```go func main() { events := goevents.Classic() //绑定并发事件 events.GoOn(ev1, "123",344,"event1 param") events.GoOn(ev2, "event2 param",454, 343,999) //最终执行事件。 //events.End(func(...interface{}){}, "123","End 事件 最后所有事件执行完 才会执行") //触发并发事件不能用Trigger events.Emit() } ``` API document [events.Classic()] //instance ev := events.Classic() .On(name string, fn func(...interface{})) 绑定事件到events对象上 ev.On("message", func(args ...interface{}){ //do some things }) .Bind(args ...interface{})*events 绑定事件参数 返回goevents对象 //绑定到当前事件上 ev.Bind("abc",123,&struct1{1,2}) //绑定事件返回的goevents对象 所以可以连贯的写法. ev.Bind(...).On("message", func(args ...interface{}){ //do something }) .Trigger(args ...string) 触发事件. 可以按照第一个参数为模块 来触发此模块的事件 不传参数 触发所有串行执行的事件 //Just trigger partion of the events by first argment. ev.Trigger("message") //If no params it will emit all the serial events ev.Trigger() .GoOn(fn func(...interface{}), args ...interface{}) 绑定事件到并行执行的事件上. ev.GoOn(func(...interface{}){ //event do something }, args) .Emit() 触发所有的事件 并行和串行的 全部会执行. ev.Emit(). .Conf(chNum int, safeMod int) 设置goevents对象的method 每个对象只能设置一次 goevents.Classic() 之后马上执行. 不设置也可以非必选 ev.Conf(3,0) .End(func(...interface{}), args ...interface{}) 最后执行的事件多 与并行执行事件结合使用

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

8158 次点击  ∙  2 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传