游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

golang2021面向对象(23)Go语言使用事件系统实现

  Go语言可以将类型的方法与普通函数视为一个概念,从而简化方法和函数混合作为回调类型时的复杂性。这个特性和C中的代理(delegate)类似,调用者无须关心谁来支持调用,系统会自动处理是否调用普通函数或类型的方法。
  本节中,首先将用简单的例子了解Go语言是如何将方法与函数视为一个概念,接着会实现一个事件系统,事件系统能有效地将事件触发与响应两端代码解耦。
  方法和函数的统一调用
  本节的例子将让一个结构体的方法(class。Do)的参数和一个普通函数(funcDo)的参数完全一致,也就是方法与函数的签名一致。然后使用与它们签名一致的函数变量(delegate)分别赋值方法与函数,接着调用它们,观察实际效果。
  详细实现请参考下面的代码。
  packagemain
  importfmt
  声明一个结构体
  typeclassstruct{
  }
  给结构体添加Do方法
  func(cclass)Do(vint){
  fmt。Println(callmethoddo:,v)
  }
  普通函数的Do
  funcfuncDo(vint){
  fmt。Println(callfunctiondo:,v)
  }
  funcmain(){
  声明一个函数回调
  vardelegatefunc(int)
  创建结构体实例
  c:new(class)
  将回调设为c的Do方法
  delegatec。Do
  调用
  delegate(100)
  将回调设为普通函数
  delegatefuncDo
  调用
  delegate(100)
  }
  代码说明如下:
  第10行,为结构体添加一个Do()方法,参数为整型。这个方法的功能是打印提示和输入的参数值。
  第16行,声明一个普通函数,参数也是整型,功能是打印提示和输入的参数值。
  第24行,声明一个delegate的变量,类型为func(int),与funcDo和class的Do()方法的参数一致。
  第30行,将c。Do作为值赋给delegate变量。
  第33行,调用delegate()函数,传入100的参数。此时会调用c实例的Do()方法。
  第36行,将funcDo赋值给delegate。
  第39行,调用delegate(),传入100的参数。此时会调用funcDo()方法。
  运行代码,输出如下:
  callmethoddo:100
  callfunctiondo:100
  这段代码能运行的基础在于:无论是普通函数还是结构体的方法,只要它们的签名一致,与它们签名一致的函数变量就可以保存普通函数或是结构体方法。
  了解了Go语言的这一特性后,我们就可以将这个特性用在事件中。
  事件系统基本原理
  事件系统可以将事件派发者与事件处理者解耦。例如,网络底层可以生成各种事件,在网络连接上后,网络底层只需将事件派发出去,而不需要关心到底哪些代码来响应连接上的逻辑。或者再比如,你注册、关注或者订阅某大V的社交消息后,大V发生的任何事件都会通知你,但他并不用了解粉丝们是如何为她喝彩或者疯狂的。如下图所示为事件系统基本原理图。
  图:事件系统基本原理
  一个事件系统拥有如下特性:
  能够实现事件的一方,可以根据事件ID或名字注册对应的事件。
  事件发起者,会根据注册信息通知这些注册者。
  一个事件可以有多个实现方响应。
  通过下面的步骤详细了解事件系统的构成及使用。
  事件注册
  事件系统需要为外部提供一个注册入口。这个注册入口传入注册的事件名称和对应事件名称的响应函数,事件注册的过程就是将事件名称和响应函数关联并保存起来,详细实现请参考下面代码的RegisterEvent()函数。
  packagemain
  实例化一个通过字符串映射函数切片的map
  vareventByNamemake(map〔string〕〔〕func(interface{}))
  注册事件,提供事件名和回调函数
  funcRegisterEvent(namestring,callbackfunc(interface{})){
  通过名字查找事件列表
  list:eventByName〔name〕
  在列表切片中添加函数
  listappend(list,callback)
  将修改的事件列表切片保存回去
  eventByName〔name〕list
  }
  调用事件
  funcCallEvent(namestring,paraminterface{}){
  通过名字找到事件列表
  list:eventByName〔name〕
  遍历这个事件的所有回调
  for,callback:rangelist{
  传入参数调用回调
  callback(param)
  }
  }
  代码说明如下:
  第4行,创建一个map实例,这个map通过事件名(string)关联回调列表(〔〕func(interface{}),同一个事件名称可能存在多个事件回调,因此使用回调列表保存。回调的函数声明为func(interface{})。
  第7行,提供给外部的通过事件名注册响应函数的入口。
  第10行,eventByName通过事件名(name)进行查询,返回回调列表(〔〕func(interface{})。
  第13行,为同一个事件名称在已经注册的事件回调的列表中再添加一个回调函数。
  第16行,将修改后的函数列表设置到map的对应事件名中。
  拥有事件名和事件回调函数列表的关联关系后,就需要开始准备事件调用的入口了。
  事件调用
  事件调用方和注册方是事件处理中完全不同的两个角色。事件调用方是事发现场,负责将事件和事件发生的参数通过事件系统派发出去,而不关心事件到底由谁处理;事件注册方通过事件系统注册应该响应哪些事件及如何使用回调函数处理这些事件。事件调用的详细实现请参考上面代码的CallEvent()函数。
  代码说明如下:
  第20行,调用事件的入口,提供事件名称name和参数param。事件的参数表示描述事件具体的细节,例如门打开的事件触发时,参数可以传入谁进来了。
  第23行,通过注册事件回调的eventByName和事件名字查询处理函数列表list。
  第26行,遍历这个事件列表,如果没有找到对应的事件,list将是一个空切片。
  第29行,将每个函数回调传入事件参数并调用,就会触发事件实现方的逻辑处理。
  使用事件系统
  例子中,在main()函数中调用事件系统的CallEvent生成OnSkill事件,这个事件有两个处理函数,一个是角色的OnEvent()方法,还有一个是函数GlobalEvent(),详细代码实现过程请参考下面的代码。
  packagemain
  importfmt
  声明角色的结构体
  typeActorstruct{
  }
  为角色添加一个事件处理函数
  func(aActor)OnEvent(paraminterface{}){
  fmt。Println(actorevent:,param)
  }
  全局事件
  funcGlobalEvent(paraminterface{}){
  fmt。Println(globalevent:,param)
  }
  funcmain(){
  实例化一个角色
  a:new(Actor)
  注册名为OnSkill的回调
  RegisterEvent(OnSkill,a。OnEvent)
  再次在OnSkill上注册全局事件
  RegisterEvent(OnSkill,GlobalEvent)
  调用事件,所有注册的同名函数都会被调用
  CallEvent(OnSkill,100)
  }
  代码说明如下:
  第6行,声明一个角色的结构体。在游戏中,角色是常见的对象,本例中,角色也是OnSkill事件的响应处理方。
  第10行,为角色结构添加一个OnEvent()方法,这个方法拥有param参数,类型为interface{},与事件系统的函数(func(interface{}))签名一致。
  第16行为全局事件响应函数。有时需要全局进行侦听或者处理一些事件,这里使用普通函数实现全局事件的处理。
  第27行,注册一个OnSkill事件,实现代码由a的OnEvent进行处理。也就是Actor的OnEvent()方法。
  第30行,注册一个OnSkill事件,实现代码由GlobalEvent进行处理,虽然注册的是同一个名字的事件,但前面注册的事件不会被覆盖,而是被添加到事件系统中,关联OnSkill事件的函数列表中。
  第33行,模拟处理事件,通过CallEvent()函数传入两个参数,第一个为事件名,第二个为处理函数的参数。
  整个例子运行结果如下:
  actorevent:100
  globalevent:100
  结果演示,角色和全局的事件会按注册顺序顺序地触发。
  一般来说,事件系统不保证同一个事件实现方多个函数列表中的调用顺序,事件系统认为所有实现函数都是平等的。也就是说,无论例子中的a。OnEvent先注册,还是GlobalEvent()函数先注册,最终谁先被调用,都是无所谓的,开发者不应该去关注和要求保证调用的顺序。
  一个完善的事件系统还会提供移除单个和所有事件的方法。

南网的智能电表和国网的智能电表有什么功能区别呢?大家好,今天介绍一下南网的智能电表和国网的智能电表的功能区别和差异,先上图透明的为南网电表不透明的为国网电表,那两块表之间有什么差异呢?先别急,从电表的封印开始介绍……618年中大促中的黑马,realme逼停小米位居TOP3今天是一个不同往常的日子,随着6月1日儿童节的来临,618年中大促也拉开序幕,这时各大手机厂商都在这一天迎来了开门红,而在众多手机厂商中,另小米、iPhone等厂商眼红的要属r……ATEN发布2端口HDMI带线式KVM多电脑切换器CS22H近日,ATEN推出了带有远程端口切换器的CS22H,它是2端口USB4KHDMI线缆KVM切换器。此外,CS22H支持USB接口设备分享共享,可通过一组USB和HDMI控制端快……微信小程序开发公司哪个最好,商家如何选择?对于很多中小微企业尤其是传统企业而言,小程序的出现可以说是又一次拥抱移动互联网,实现企业转型的大好机遇。很多商家都在搭建自己的小程序,那么哪家公司开发的小程序是最好的呢,商家该……雇主vs员工期望的远程办公模式随着公司绞尽脑汁让员工回到办公室办公(尽管有人担心Delta变异毒株激增),有关远程和混合工作模式(即每周有几天在办公室工作,其余时间在家工作)的争论不可避免。雇主希望员工在办……2020年营运利润同比增长4。9,中国平安站在新周期的起点有人说,投资是一场赔率和概率的游戏。在当下,所有人都押注成长股的市场里,赔率的意义不用多说。而所谓的概率,就更像一道所有人都会解的简单题。简单题并不需要做太多计算与推演,……蓝光发展被迫卖卖卖背后,中小房企暴雷潮开始了4月底,蓝光发展卖身传闻四起,这家成立于1993年的老房企,似乎已经很难撑到而立之年。这也不奇怪,谁让公司在过去几年,太激进了呢。2015年开启的房地产小牛市,让敢……彰显长期信心,乐享互动多位股东延长15个月股份锁定期3月23日,港股上市公司乐享互动(HK:06988)发布公告称,公司近日收到包括本公司控股股东在内的合计持股约69。16的部分股东的承诺函。鉴于对本公司长远发展前景的信心,上述……东风风神品牌向上力作,奕炫MAX上市9。39万起9月1日,搭载东风全新马赫动力的首款车型东风风神奕炫MAX全球上市,此次上市共推出6款车型,含5款燃油版车型和1款混动版车型,满足不同客户的需求。奕炫MAX售价区间在9。39万……读新能源车的终极猜想Part2这是我的几篇学习思考,来自启发俱乐部李丰专场。写下来理理自己的思路,同时作为记录可以回顾。另外,因为是自己的学习思考,所以可能会对原文有一定的曲解,所以如果你想知道……王志勤车联网支持实现无人驾驶的思考无人驾驶是车辆作为运载工具智能化、网联化发展的核心应用功能,也是车联网、智慧交通产业发展的核心应用服务。网联无人驾驶则是在车辆智能化基础上,通过车联网实现车与车、车与路等的互联……天猫618手机数码销量一骑绝尘,网友京东主场优势没了!谁敢横刀立马,唯我猫大将军!5秒,天猫手机销量破万;22秒,天猫电脑数码产品销量突破10万!6月18日零点刚过,天猫618将持续两周的购物热情推至高潮,特别是在手机……
人族三祖三皇五帝人族三祖是人族发展初期最重要的三个人,是他们带着原始的人族走出原始的生活。有两种说法:伏羲燧人神农燧人有巢缁衣(现代网络小说一般采用第二种说法)燧人氏,三祖之一,是……山西加油!特大暴雨侵袭山西,在救助过程中发生了很多暖心的事情从10月2日晚至今,山西连续遭遇特大暴雨、强降雨侵袭,短短一周的时间,下了一个月的雨量。导致全省大部分地区出现内涝、地质灾害、洪水等灾情,更是出现了四十年一遇的洪峰,山体……万达轻资产转型,有远见!王健林为何总是能抓住机遇?市场竞争无时无刻不在,任何人都不能放松警惕,那些原本的优势,只要稍有懈怠就会被削弱。如今我国的市场经济体制改革不断深入,开放程度也进一步扩大,因此各地都高招频出,采取措施招商引……容知日新国内工业设备运行监控前五风电周期向下其他应用崛起独立客观第三方研究,为您筛选优质上市公司证券代码:688768综合评级:A一、主营业务评分:751、业务分析:公司是一家工业设备智能运维整体解决方案提供商,简……商标热点丨小米申请37件小米有品华为注册华为山海等1、华为技术有限公司近日提交了多件华为山海、华为北冥、华为小菊灯、华为天池、华为小艺以及拼音HuaweiShanHai、HuaweiBeiMing等商标,很有华为的风格。……给儿子买了台红米note10pro去年618赶上家里正在装修,网上买了不少家具电器,今年正好孩子要上初中,想着也该给他买台手机了,借着618的东风1498买了台红米n10pro,天玑1100速度很快适合没耐心的……银河破裂者上线你想去太空探险吗?在今年9月17日举行的B站高能电玩节上,EXORStudios发行了新作《银河破裂者》的最新预告,同时也再次确定10月14日发售的定档信息。这款备受期待的建造类生存机甲RPG游……比亚迪海豚Vs欧拉好猫,起步价10万元左右的电动车,谁才是王随着比亚迪海豚紧锣密鼓的上市,又将人们的注意力吸引到高配入门级新能源车市场。而同样作为入门级新能源车,以比亚迪海豚为代表的产品已经将价位推进到了十万元以上。不得不说,在这一价格……关于房产税的个人预测大家好,我是老李。今天和大家聊聊房产税。接下来的文字都基于老李个人的预测,所以仅供参考,大家可以提出自己不同的意见,互相讨论,至于是否预测成功,就交给时间和读者们见……真快乐APP千万奖金挑战赛火爆全网热血battle一触即发万事皆可赛,生活有多少种可能,就有多少种赛道。从10月21日开始,全新改版试运营的真快乐APP发起千万奖金挑战赛,各种风趣脑洞大的赛事集体上线,引数万人涌进赛事间挑战他人……巴比伦健康与微信在中国的合作终止,承认人工智能短期内让人失望据彭博加拿大2月19日报道,巴比伦医疗集团首席执行官阿里帕尔萨表示,该公司在中国曾与腾讯控股有限公司旗下的微信建立了合作关系,但由于无法提出一种商业上可行的模式,该公司已经撤出……名企头条冒充老干妈员工行骗嫌疑人被批捕字节跳动回应交易禁令【余承东:消费者业务上半年收入2558亿元手机发货量1。05亿台】华为消费者业务CEO余承东透露,华为消费者业务上半年销售收入2558亿元,上半年华为手机全球发货量1。05亿台……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网