Go 实现的轻量级的事件管理、调度工具库
- 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"})
- }
- 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
- }
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)
github 地址:https://github.com/gookit/event