在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 事件驱动 实现事件的晌应和处理相关推荐

  1. java 事件驱动模式_事件驱动

    EDA事件驱动架构 事件代表过去发生的事件,事件既是技术架构概念,也是业务概念.以事件为驱动的编程模型称为事件驱动架构EDA. EDA是一种以事件为媒介,实现组件或服务之间最大松耦合的方式.传统面向接 ...

  2. python输出价目表-Python:使用基于事件驱动的SAX解析XML

    SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 ...

  3. EDA 事件驱动架构与 EventBridge 二三事

    作者|肯梦 当下比较成功的企业已然认识到,要想最大限度提升运营效率和客户体验,务必将业务和技术两方面的举措紧密结合起来.运营事件或业务形势的变化是时下众多企业关注的焦点,这些变化能够为企业领导者带来切 ...

  4. html select选择事件_一道搜狗面试题:IO多路复用中select、poll、epoll之间的区别...

    (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对 ...

  5. JavaScript之event事件

    目录 1:事件驱动1 2:事件分类2 3:事件对象event3 4:关于鼠标事件对象属性3 应用:5 5:关于键盘事件对象的属性6 6:目标事件源对象7 7. 事件冒泡7 应用:8 CSS模拟下拉菜单 ...

  6. JavaScript学习笔记——事件

    javascript事件基础和事件绑定 一.事件驱动 1.事件 javascript侦测到的用户的操作或是页面的一些行为(怎么发生的) 2.事件源 引发事件的元素.(发生在谁的身上) 3.事件处理程序 ...

  7. java事件溯源_领域事件与事件溯源 - 解道Jdon

    领域事件.事件溯源.事件风暴建模 事件代表过去发生的事件,事件既是技术架构概念,也是业务概念.以事件为驱动的编程模型称为事件驱动架构EDA,事件驱动与事件溯源EventSourcing是两种概念,ED ...

  8. 【JS】JavaScript的事件驱动和处理

    目录 事件 鼠标触发 键盘触发 页面触发 表单触发 事件驱动 事件处理程序调用方法 作为HTML标记的属性 作为对象的属性值 事件 用户和web页面交互产生的动作,包括:鼠标触发.键盘触发.页面触发. ...

  9. 一款让人耳目一新的事件驱动型RTOS

    最近有幸接触到了一款新的开源 RTOS 项目,这个项目与传统的 RTOS 不太一样,它是以事件驱动为核心的 RTOS.因此,这个项目的名字为 EventOS.不同于传统的 RTOS 以时钟节拍为驱动核 ...

最新文章

  1. scikit_image
  2. markdown 字体颜色_一文搞定Markdown编辑头条号方法
  3. mixin network_基于Mixin Network的Go语言比特币开发教程 : 用 Mixin Messenger 机器人接受和发送比特币...
  4. 【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数
  5. Qt程序启动画面QSplashScreen类
  6. 神经网络激活函数与损失函数
  7. js 的push 方法
  8. osm数据下载 python_用Python编写小工具下载OSM路网数据
  9. 计算机原理考研题库,东北大学计算机组成原理题库(9)
  10. 传奇DBC数据库变量详细解释传奇DB文件详解
  11. AnyLogic简介
  12. VM 虚拟机 分辨率问题
  13. Kali Linux Web 渗透测试秘籍 第七章 高级利用
  14. 软工课设-基于JAVA的​大学年级事务督办系统项目和源码​
  15. QTreeWidget使用整理
  16. 企业发放的奖金根据利润I提成
  17. 学好c语言对php的帮助,学好c语言可以干什么?
  18. 【C++ set的基本操作】
  19. Hive数据类型、数据库相关操作、表的相关操做、数据的导入导出
  20. Matlab求常微分方程组的数值解

热门文章

  1. 如何提高计算机网络速度,如何提高电脑网速方法
  2. 张钜楷:1.20黄金晚间行情如何操作、黄金白银TD最新操作建议及解套
  3. nodejs+vue基于协同过滤的旅游推荐系统vscode
  4. mysql 8.0版本 error 3516 ;error 3618
  5. js之onreadystatechange事件
  6. word编辑的公式转换为mathtype,公式自动编号,数学公式规范
  7. Android 64 bit的一些兼容性分析
  8. 使用阿里云Windows云服务器用公网ip访问Django制作的网页(不涉及IIS)
  9. 怎么做能防止B站再崩?
  10. 网络安全周 | 分享8个网络安全小知识