ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-05-30 19:02:59  阅读:176  来源: 互联网

标签:Do struct 示例 函数 事件 注册 Go funcDo delegate


示例:使用事件系统实现事件的响应和处理

  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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有