这里说的代码解耦不是指用消息队列时那种业务解耦,而是代码层面的逻辑解耦。比如某个控件输入变化时,希望通知到其他代码组件模块,这时候直接调用相关的接口会让代码显得非常生硬,难以维护。这时候事件分发可以让这种逻辑显得更加灵活易扩展,维护起来更加容易。
这里推荐一个golang项目上非常实用的事件分发库——Event,安装方式如下
go get -v github.com/gookit/event
使用方式可以说是非常简单,支持同步、异步通知,还能添加触发器。Event库的源码非常简单,但是抽象性完全满足日常需求。下面列举下使用方式:
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)
// 需要注意的是会按优先级触发事件执行
// Trigger event
// 同步触发事件,异常会panic
event.MustFire("evt1", event.M{"arg0": "val0", "arg1": "val1"})
// 同步触发事件,返回error
err := event.MustFire("evt1", event.M{"arg0": "val0", "arg1": "val1"})
// 异步触发
event.AsyncFire("evt1", event.M{"arg0": "val0", "arg1": "val1"})
}
看了Event库之后是不是觉得很多业务逻辑可以很方便的进行解耦了呢? 欢迎评论区讨论!