先来看在上一篇文章中事件的使用方法,这里只看事件的监听:
package listen
import (
"fmt"
event2 "skeleton/app/event/entity"
"skeleton/internal/event"
)
type DemoEventListen struct {
}
func (*DemoEventListen) Listen() event.EventInterface {
return &event2.DemoEvent{}
}
func (*DemoEventListen) Process(data any) (any, error) {
return fmt.Sprintf("%v --> %s", data, "exec DemoEventListen.Process"), nil
}
Listen() event.EventInterface
函数只返回一个事件,也就是这个监听器只和DemoEvent
这一个事件绑定了。
但是如果业务中,需要在某些事件发生时同时处理多个逻辑,例如事件发生时,需要 记录日志、发送邮件、处理请求等。
然后骨架里面就对event
做了如下修改:
-
定义事件实体(事件定义没有过多的修改,相较于之前只删除了定义事件名称函数
EventName() string
)在
app/event/entity
目录下定义一个事件实体,该实体实现了event.EventInterface
接口:package entity type DemoEvent1 struct {} func (d *DemoEvent1) GetData() any { return "DemoEvent1 param" } type DemoEvent2 struct {} func (d *DemoEvent2) GetData() any { return "DemoEvent2 param" }
-
定义事件监听
在
app/event/listen
目录中定义一个DemoEventListen
事件监听,并且该DemoEventListen
结构体必须要实现event.Interface
接口:package listen import ( "fmt" event2 "skeleton/app/event/entity" "skeleton/internal/event" ) type DemoEventListen struct { } func (*DemoEventListen) Listen() []event.EventInterface { return []event.EventInterface{ &event2.DemoEvent1{}, &event2.DemoEvent2{} } } func (*DemoEventListen) Process(data any) { fmt.Printf("%v --> %s", data, "exec DemoEventListen.Process") }
Listen()
函数的返回值改成了事件切片[]event.EventInterface
Process(data any)
函数取消了返回值 -
最后需要将事件进行注册,在
app/event/event.go
文件中的Init
方法内执行:variable.Event.Register(&listen.DemoEventListen{})
-
调用事件执行
// 同步 variable.Event.Dispatch(&entity.DemoEvent{}) // 异步 variable.Event.DispatchAsync(&entity.DemoEvent{})
事件的调用,增加了异步方法
DispatchAsync(event EventInterface) error
骨架仓库地址如下: