Go 事件驱动 实现事件的晌应和处理
在C语言里面也有 很多这样的代码 这里go版本
基本观点:
Go语言可以将类型的方法与普通函数视为一个概念,
从而简化方法和函数混合作为回调类型时的复杂性。
这个特性和 C# 中的代理(delegate)类似,
调用者无须关心谁来支持调用,系统会自动处理是否调用普通函数或类型的方法。
测试代码:
package mainimport "fmt"// 声明一个结构体
type class struct {
}// 给结构体添加Do方法
func (c *class) Do(v int) {fmt.Println("call method do:", v)
}// 普通函数的Do
func funcDo(v int) {fmt.Println("call function do:", v)
}func main() {// 声明一个函数回调var delegate func(int)// 创建结构体实例c := new(class)// 将回调设为c的Do方法delegate = c.Do// 调用delegate(100)// 将回调设为普通函数delegate = funcDo// 调用delegate(100)
}
结果:
[Running] go run "c:\Users\Koson.Gong\Desktop\sgo\main.go"
call method do: 100
call function do: 100
例子是让一个结构体的方法(class.Do)的参数和一个普通函数(funcDo)的参数完全一致。
然后使用与它们签名一致的函数变量(delegate)分别赋值方法与函数,
接着调用它们,观察实际效果。
代码说明如下:
- 第 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() 方法。
运行代码,输出如下:
call method do: 100
call function do: 100
这段代码能运行的基础在于:无论是普通函数还是结构体的方法,只要它们的签名一致,与它们签名一致的函数变量就可以保存普通函数或是结构体方法。了解了 Go语言的这一特性后,我们就可以将这个特性用在事件中。
Go语言事件系统实现事件的晌应和处理
package mainimport "fmt"// 声明角色的结构体
type Actor struct {
}// 为角色添加一个事件处理函数
func (a *Actor) OnEvent(param interface{}) {fmt.Println("actor event:", param)
}// 全局事件
func GlobalEvent(param interface{}) {fmt.Println("global event:", param)
}func main() {// 实例化一个角色a := new(Actor)// 注册名为OnSkill的回调RegisterEvent("OnSkill", a.OnEvent)// 再次在OnSkill上注册全局事件RegisterEvent("OnSkill", GlobalEvent)// 调用事件,所有注册的同名函数都会被调用CallEvent("OnSkill", 100)}
//// 调用事件
func CallEvent(name string, param interface{}) {// 通过名字找到事件列表list := eventByName[name]// 遍历这个事件的所有回调for _, callback := range list {// 传入参数调用回调callback(param)}}
///
// 实例化一个通过字符串映射函数切片的map
var eventByName = make(map[string][]func(interface{}))// 注册事件,提供事件名和回调函数
func RegisterEvent(name string, callback func(interface{})) {// 通过名字查找事件列表list := eventByName[name]// 在列表切片中添加函数list = append(list, callback)// 将修改的事件列表切片保存回去eventByName[name] = list
}
Go 事件驱动 实现事件的晌应和处理相关推荐
- java 事件驱动模式_事件驱动
EDA事件驱动架构 事件代表过去发生的事件,事件既是技术架构概念,也是业务概念.以事件为驱动的编程模型称为事件驱动架构EDA. EDA是一种以事件为媒介,实现组件或服务之间最大松耦合的方式.传统面向接 ...
- python输出价目表-Python:使用基于事件驱动的SAX解析XML
SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 ...
- EDA 事件驱动架构与 EventBridge 二三事
作者|肯梦 当下比较成功的企业已然认识到,要想最大限度提升运营效率和客户体验,务必将业务和技术两方面的举措紧密结合起来.运营事件或业务形势的变化是时下众多企业关注的焦点,这些变化能够为企业领导者带来切 ...
- html select选择事件_一道搜狗面试题:IO多路复用中select、poll、epoll之间的区别...
(1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对 ...
- JavaScript之event事件
目录 1:事件驱动1 2:事件分类2 3:事件对象event3 4:关于鼠标事件对象属性3 应用:5 5:关于键盘事件对象的属性6 6:目标事件源对象7 7. 事件冒泡7 应用:8 CSS模拟下拉菜单 ...
- JavaScript学习笔记——事件
javascript事件基础和事件绑定 一.事件驱动 1.事件 javascript侦测到的用户的操作或是页面的一些行为(怎么发生的) 2.事件源 引发事件的元素.(发生在谁的身上) 3.事件处理程序 ...
- java事件溯源_领域事件与事件溯源 - 解道Jdon
领域事件.事件溯源.事件风暴建模 事件代表过去发生的事件,事件既是技术架构概念,也是业务概念.以事件为驱动的编程模型称为事件驱动架构EDA,事件驱动与事件溯源EventSourcing是两种概念,ED ...
- 【JS】JavaScript的事件驱动和处理
目录 事件 鼠标触发 键盘触发 页面触发 表单触发 事件驱动 事件处理程序调用方法 作为HTML标记的属性 作为对象的属性值 事件 用户和web页面交互产生的动作,包括:鼠标触发.键盘触发.页面触发. ...
- 一款让人耳目一新的事件驱动型RTOS
最近有幸接触到了一款新的开源 RTOS 项目,这个项目与传统的 RTOS 不太一样,它是以事件驱动为核心的 RTOS.因此,这个项目的名字为 EventOS.不同于传统的 RTOS 以时钟节拍为驱动核 ...
最新文章
- scikit_image
- markdown 字体颜色_一文搞定Markdown编辑头条号方法
- mixin network_基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币...
- 【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数
- Qt程序启动画面QSplashScreen类
- 神经网络激活函数与损失函数
- js 的push 方法
- osm数据下载 python_用Python编写小工具下载OSM路网数据
- 计算机原理考研题库,东北大学计算机组成原理题库(9)
- 传奇DBC数据库变量详细解释传奇DB文件详解
- AnyLogic简介
- VM 虚拟机 分辨率问题
- Kali Linux Web 渗透测试秘籍 第七章 高级利用
- 软工课设-基于JAVA的​大学年级事务督办系统项目和源码​
- QTreeWidget使用整理
- 企业发放的奖金根据利润I提成
- 学好c语言对php的帮助,学好c语言可以干什么?
- 【C++ set的基本操作】
- Hive数据类型、数据库相关操作、表的相关操做、数据的导入导出
- Matlab求常微分方程组的数值解
热门文章
- 如何提高计算机网络速度,如何提高电脑网速方法
- 张钜楷:1.20黄金晚间行情如何操作、黄金白银TD最新操作建议及解套
- nodejs+vue基于协同过滤的旅游推荐系统vscode
- mysql 8.0版本 error 3516 ;error 3618
- js之onreadystatechange事件
- word编辑的公式转换为mathtype,公式自动编号,数学公式规范
- Android 64 bit的一些兼容性分析
- 使用阿里云Windows云服务器用公网ip访问Django制作的网页(不涉及IIS)
- 怎么做能防止B站再崩?
- 网络安全周 | 分享8个网络安全小知识