package
0.0.0-20220824021342-5961e9c4d224
Repository: https://github.com/xiaodingding/iotfast.git
Documentation: pkg.go.dev
# README
Event
Go 实现的轻量级的事件管理、调度工具库
- 支持自定义定义事件对象
- 支持对一个事件添加多个监听器
- 支持设置事件监听器的优先级,优先级越高越先触发
- 支持根据事件名称前缀
PREFIX.*
来进行一组事件监听.- 注册
app.*
事件的监听,触发app.run
app.end
时,都将同时会触发app.*
事件
- 注册
- 支持使用通配符
*
来监听全部事件的触发 - 完善的单元测试,单元覆盖率
> 95%
主要方法
On/Listen(name string, listener Listener, priority ...int)
注册事件监听Subscribe/AddSubscriber(sbr Subscriber)
订阅,支持注册多个事件监听Trigger/Fire(name string, params M) (error, Event)
触发事件MustTrigger/MustFire(name string, params M) Event
触发事件,有错误则会panicFireEvent(e Event) (err error)
根据给定的事件实例,触发事件FireBatch(es ...interface{}) (ers []error)
一次触发多个事件AsyncFire(e Event)
Async fire event by 'go' keywords
快速使用
package main
import (
"fmt"
"github.com/gookit/event"
)
func main() {
// 注册事件监听器
event.On("evt1", event.ListenerFunc(func(e event.Event) error {
fmt.Printf("handle event: %s\n", e.Name())
return nil
}), event.Normal)
// 注册多个监听器
event.On("evt1", event.ListenerFunc(func(e event.Event) error {
fmt.Printf("handle event: %s\n", e.Name())
return nil
}), event.High)
// ... ...
// 触发事件
// 注意:第二个监听器的优先级更高,所以它会先被执行
event.MustFire("evt1", event.M{"arg0": "val0", "arg1": "val1"})
}
Note: 注意:第二个监听器的优先级更高,所以它会先被执行
使用通配符
注册事件监听器和名称以通配符*
结尾:
func main() {
dbListener1 := event.ListenerFunc(func(e event.Event) error {
fmt.Printf("handle event: %s\n", e.Name())
return nil
})
event.On("app.db.*", dbListener1, event.Normal)
}
在其他逻辑上触发事件:
func doCreate() {
// do something ...
// Trigger event
event.MustFire("app.db.create", event.M{"arg0": "val0", "arg1": "val1"})
}
func doUpdate() {
// do something ...
// Trigger event
event.MustFire("app.db.update", event.M{"arg0": "val0"})
}
像上面这样,触发 app.db.create
app.db.update
事件,都会触发执行 dbListener1
监听器.
编写事件监听
使用匿名函数
package mypgk
import (
"fmt"
"github.com/gookit/event"
)
var fnHandler = func(e event.Event) error {
fmt.Printf("handle event: %s\n", e.Name())
return nil
}
func Run() {
// register
event.On("evt1", event.ListenerFunc(fnHandler), event.High)
}
使用结构体方法
interface:
// Listener interface
type Listener interface {
Handle(e Event) error
}
示例:
实现接口
event.Listener
package mypgk
import (
"fmt"
"github.com/gookit/event"
)
type MyListener struct {
// userData string
}
func (l *MyListener) Handle(e event.Event) error {
e.Set("result", "OK")
return nil
}
同时注册多个事件监听
interface:
// Subscriber event subscriber interface.
// you can register multi event listeners in a struct func.
type Subscriber interface {
// SubscribedEvents register event listeners
// key: is event name
// value: can be Listener or ListenerItem interface
SubscribedEvents() map[string]interface{}
}
示例
实现接口
event.Subscriber
package mypgk
import (
"fmt"
"github.com/gookit/event"
)
type MySubscriber struct {
// ooo
}
func (s *MySubscriber) SubscribedEvents() map[string]interface{} {
return map[string]interface{}{
"e1": event.ListenerFunc(s.e1Handler),
"e2": event.ListenerItem{
Priority: event.AboveNormal,
Listener: event.ListenerFunc(func(e Event) error {
return fmt.Errorf("an error")
}),
},
"e3": &MyListener{},
}
}
func (s *MySubscriber) e1Handler(e event.Event) error {
e.Set("e1-key", "val1")
return nil
}
编写自定义事件
如果你希望自定义事件对象或者提前定义好一些固定事件信息,可以实现 event.Event
接口.
interface:
// Event interface
type Event interface {
Name() string
// Target() interface{}
Get(key string) interface{}
Add(key string, val interface{})
Set(key string, val interface{})
Data() map[string]interface{}
SetData(M) Event
Abort(bool)
IsAborted() bool
}
示例
package mypgk
import (
"fmt"
"github.com/gookit/event"
)
type MyEvent struct{
event.BasicEvent
customData string
}
func (e *MyEvent) CustomData() string {
return e.customData
}
使用:
e := &MyEvent{customData: "hello"}
e.SetName("e1")
event.AddEvent(e)
// add listener
event.On("e1", event.ListenerFunc(func(e event.Event) error {
fmt.Printf("custom Data: %s\n", e.(*MyEvent).CustomData())
return nil
}))
// trigger
event.Fire("e1", nil)
// OR
// event.FireEvent(e)
# Functions
AddEvent has event check.
AddSubscriber register a listener to the event.
AsyncFire async fire event by 'go' keywords.
Fire listeners by name.
FireBatch fire multi event at once.
FireEvent fire listeners by Event instance.
GetEvent get event by name.
HasEvent has event check.
HasListeners has listeners for the event name.
Listen register a listener to the event.
MustFire fire event by name.
MustTrigger alias of MustFire.
NewBasic new a basic event instance.
NewManager create event manager.
On register a listener to the event.
Reset the default event manager.
Subscribe register a listener to the event.
Trigger alias of Fire.
TriggerEvent alias of FireEvent.
# Constants
There are some default priority constants.
There are some default priority constants.
There are some default priority constants.
There are some default priority constants.
There are some default priority constants.
There are some default priority constants.
There are some default priority constants.
Wildcard event name.
# Variables
DefaultEM default event manager.
# Structs
BasicEvent a basic event struct define.
ListenerItem storage a event listener and it's priority value.
ListenerQueue storage sorted Listener instance.
Manager event manager definition.
# Interfaces
Event interface.
Listener interface.
ManagerFace event manager interface.
Subscriber event subscriber interface.
# Type aliases
ByPriorityItems type.
ListenerFunc func definition.
M is short name for map[string]...