go语言事件响应系统简述

事件响应系统是一个提供了事件注册,事件调用与一体的系统,能让上层应用和底层业务实现解耦,实现分层部署。上层应用通过注册自己感兴趣的事件(一般传递事件名字),在适时的使用调用事件函数获取返回的信息。而底层实现就是事件注册系统,则提供了如何注册事件响应函数,如何调用的实现细节。

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两个事件名的响应函数,当删除一个事件名后,再调用就会提示报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值