Go从入门到精通——结构体(struct)——示例:使用事件系统实现事件的响应和处理
作者:互联网
示例:使用事件系统实现事件的响应和处理
Go 语言可以将类型的方法与普通函数视为一个概念,从而简化方法和函数混合作为回调类型时的复杂性。这个特性和 C# 中的代理(delegate)类似,调用者无须关心谁来支持调用,系统会自动处理是否调用普通函数或类型的方法。 本节中,首先将用简单的例子了解 Go 语言是如何将方法与函数视为一个概念,接着会实现一个事件系统,事件系统能有效地将事件触发与响应两端代码解耦。1、方法和函数的统一调用
本节的例子将让一个结构体的方法(class.Do)的参数和一个普通函数(funcDo)的参数完全一致,也就是方法与函数的签名一致。然后使用与它们签名一致的函数变量(delegate)分别赋值方法与函数,接着调用它们,观察实际效果。
代码 1-1, 函数代理(具体文件:.../delegate/delegate.go)
package main import "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 method do:", v) } func main() { //声明一个 delegate 变量,类型为 func(int),与 funcDo 和 class 的 Do()方法的参数一致。 var delegate func(int) //创建结构体实例 c := new(class) //将 c.Do 作为值赋给 delegate 变量。 delegate = c.Do //调用 delegate() 函数,传入 100 的参数。此时会调用 c 实例的 Do() 方法。 delegate(100) //将 funcDo 作为值赋给 delegate。 delegate = funcDo //调用 delegate(), 传入 100 的参数,此时会调用 funcDo() 方法。 delegate(100) }
2、事件系统基本原理
事件系统可以将事件派发者与事件处理者解耦。例如,网络底层可以生成各种事件,在网络连接上后,网络底层只需将事件派发出去,而不需要关心到底哪些代码来响应连接上的逻辑。或者再比如,你注册、关注或者订阅某“大V”的社交消息后,“大V”发生的任何事件都会通知你,但他并不用了解粉丝们是如何为他喝彩或者疯狂的。
一个事件系统拥有如下特性:
-
- 能够实现事件的乙方,可以根据事件 ID 或 名字 注册对应的事件。
- 事件发起者,会根据注册信息通知这些注册者。
- 一个事件可以有多个实现方响应。
3、事件注册
事件系统需要为外部提供一个注册入口。这个注册入口传入注册的事件名称和对应事件名称的响应函数,事件注册的过程就是将事件名称和响应函数关联并保存起来。
代码 1-2, 注册事件(具体文件:.../eventssys/reg.go)
标签:Do,struct,示例,函数,事件,注册,Go,funcDo,delegate 来源: https://www.cnblogs.com/zuoyang/p/16327113.html