事件响应系统是一个提供了事件注册,事件调用与一体的系统,能让上层应用和底层业务实现解耦,实现分层部署。上层应用通过注册自己感兴趣的事件(一般传递事件名字),在适时的使用调用事件函数获取返回的信息。而底层实现就是事件注册系统,则提供了如何注册事件响应函数,如何调用的实现细节。
package main
import "fmt"
//创建一个事件响应map映射,事件名-事件函数切片
//每个事件函数传递2个int64变量,返回bool和错误值
var evmap=map[string][]func(a,b int64)(bool,error){}
//注册事件,传递事件名,以及1个事件函数
func RegEv(name string,newf func(a,b int64)(bool,error)) {
funclist:=evmap[name]//从map里获取事件函数切片
funclist=append(funclist,newf) //向切片里添加新的事件函数
evmap[name]=funclist //保存到map
}
//删除事件,传递事件名即可
func DelEv(name string)(bool,error){
delete(evmap,name)//从map里删除一个事件
return true,nil
}
//调用事件,传递事件名,以及事件函数的2个int64参数
func CallEv(name string,a,b int64)(bool,error) {
funclist:=evmap[name]//找到事件函数切片
if len(funclist)==0 {
return false,fmt.Errorf("没有%v的注册事件函数\n",name)
}
var br bool
var err error
for _,f:=range funclist {//依次枚举切片里每一个事件函数
br,err=f(a,b) //调用事件函数
if err != nil {
break
}
}
return br,err
}
//定义了具体的事件函数myadd
func myadd(a,b int64)(bool,error) {
if a==0 || b==0 {
return false,fmt.Errorf("myadd函数调用失败:参数不能为0,a=%v,b=%v\n",a,b)
}
fmt.Println("myadd函数调用成功:",a+b)
return true,nil
}
//定义了具体的事件函数mydiv
func mydiv(a,b int64)(bool,error) {
if b==0 {
return false,fmt.Errorf("mydiv函数调用失败:除数不能为0,b=%v\n",b)
}
fmt.Println("mydiv函数调用成功:商->",a/b,"余数->",a%b)
return true,nil
}
func main() {
RegEv("arithm1",myadd)
RegEv("arithm1",mydiv)
RegEv("arithm2",myadd)
br,err:=CallEv("arithm1",11,5)
if !br {
fmt.Println(err)
}
DelEv("arithm1")
br,err=CallEv("arithm1",11,5)
if !br {
fmt.Println(err)
}
br,err=CallEv("arithm2",29,5)
if !br {
fmt.Println(err)
}
}
上边例子是注册了arithm1和arithm2两个事件名的响应函数,当删除一个事件名后,再调用就会提示报错。