其他分享
首页 > 其他分享> > Go从入门到精通——结构体(struct)——示例:使用事件系统实现事件的响应和处理

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”发生的任何事件都会通知你,但他并不用了解粉丝们是如何为他喝彩或者疯狂的。

  一个事件系统拥有如下特性:

 3、事件注册  

  事件系统需要为外部提供一个注册入口。这个注册入口传入注册的事件名称和对应事件名称的响应函数,事件注册的过程就是将事件名称和响应函数关联并保存起来。

 代码 1-2, 注册事件(具体文件:.../eventssys/reg.go)


 

标签:Do,struct,示例,函数,事件,注册,Go,funcDo,delegate
来源: https://www.cnblogs.com/zuoyang/p/16327113.html