日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Go事件管理器:簡單實(shí)現(xiàn)

來源: 責(zé)編: 時(shí)間:2023-11-28 09:37:20 222觀看
導(dǎo)讀在編程中,事件管理器是一種常見的工具,用于通過通知來觸發(fā)操作。在Go語言中,我們可以通過創(chuàng)建事件管理器和監(jiān)聽器來實(shí)現(xiàn)事件的處理。本文將介紹一個(gè)簡單的Go事件管理器的實(shí)現(xiàn),并通過異步改進(jìn)提高其性能。監(jiān)聽器首先,我們需

在編程中,事件管理器是一種常見的工具,用于通過通知來觸發(fā)操作。在Go語言中,我們可以通過創(chuàng)建事件管理器和監(jiān)聽器來實(shí)現(xiàn)事件的處理。本文將介紹一個(gè)簡單的Go事件管理器的實(shí)現(xiàn),并通過異步改進(jìn)提高其性能。8un28資訊網(wǎng)——每日最新資訊28at.com

監(jiān)聽器

首先,我們需要?jiǎng)?chuàng)建一個(gè)監(jiān)聽器。在這個(gè)實(shí)現(xiàn)中,監(jiān)聽器只是一個(gè)接收事件參數(shù)的函數(shù)。8un28資訊網(wǎng)——每日最新資訊28at.com

type Listener[T any] func(T)

事件管理器

事件管理器是一個(gè)用于管理事件和監(jiān)聽器的結(jié)構(gòu)。它具有兩個(gè)方法:Add和Run。Add方法用于將新的監(jiān)聽器附加到事件上,而Run方法用于執(zhí)行事件管理器。8un28資訊網(wǎng)——每日最新資訊28at.com

type Manager[T any] interface { Add(n string, l Listener[T]) Run()}

抽象事件管理器

為了方便使用,我們可以創(chuàng)建一個(gè)抽象事件管理器,它實(shí)現(xiàn)了事件管理器接口的一部分通用邏輯。雖然Go語言并不是面向?qū)ο蟮模覀兛梢酝ㄟ^模擬來實(shí)現(xiàn)類似的效果。8un28資訊網(wǎng)——每日最新資訊28at.com

type BaseManager[T any] struct { lst map[string][]Listener[T]}func (m *BaseManager[T]) Invoke(n string, args T) { for _, ls := range m.lst[n] {  ls(args) }}func (m *BaseManager[T]) Add(n string, l Listener[T]) { m.lst[n] = append(m.lst[n], l)}

BaseManager提供了Add方法用于添加監(jiān)聽器和Invoke方法用于觸發(fā)指定事件的監(jiān)聽器。8un28資訊網(wǎng)——每日最新資訊28at.com

具體事件管理器

下面是一個(gè)具體的事件管理器的示例實(shí)現(xiàn):命令事件管理器。該管理器接收用戶從控制臺(tái)輸入的命令,并根據(jù)命令類型觸發(fā)相應(yīng)的事件。8un28資訊網(wǎng)——每日最新資訊28at.com

type Command struct { Kind string Args []string}type CommandEventManager struct { BaseManager[*Command]}func (m *CommandEventManager) Run() { var (  inp  string  args Command ) fmt.Scanln(&inp) cmd := strings.Split(inp, ":") if l := len(cmd); l == 0 {  m.Invoke("no-command", nil) } else if l > 1 {  args.Args = strings.Split(cmd[1], " ") } args.Kind = cmd[0] m.Invoke("any-command", &args) m.Invoke(args.Kind, &args)}func NewCommandEventManager() Manager[*Command] { return &CommandEventManager{  BaseManager: BaseManager[*Command]{lst: make(map[string][]Listener[*Command])}, }}

Run方法獲取用戶從控制臺(tái)輸入的命令,并解析命令參數(shù)。如果沒有命令或者命令參數(shù),則觸發(fā)"no-command"事件;否則,觸發(fā)"any-command"事件和具體命令的事件。8un28資訊網(wǎng)——每日最新資訊28at.com

添加監(jiān)聽器

讓我們向命令事件管理器添加一些監(jiān)聽器。8un28資訊網(wǎng)——每日最新資訊28at.com

func main() { cem := NewCommandEventManager() cem.Add("no-command", func(_ *Command) {  fmt.Println("no command was recieved") }) cem.Add("any-command", func(c *Command) {  fmt.Printf("the %s command was executed", c.Kind) }) cem.Add("sum", func(c *Command) {  a, _ := strconv.Atoi(c.Args[0])  b, _ := strconv.Atoi(c.Args[1])  fmt.Printf("the sum result is: %d", a+b) }) cem.Run()}

在上面的示例中,程序只執(zhí)行一次,但你可以將其放在一個(gè)無限循環(huán)中以持續(xù)監(jiān)聽命令。8un28資訊網(wǎng)——每日最新資訊28at.com

異步改進(jìn)

可以將事件管理器的執(zhí)行改為異步方式,以提高性能。每次執(zhí)行事件時(shí),可以將其作為一個(gè)goroutine進(jìn)行處理。甚至可以將每個(gè)監(jiān)聽器的執(zhí)行也放在一個(gè)goroutine中,以提高并發(fā)性能。8un28資訊網(wǎng)——每日最新資訊28at.com

通過上述改進(jìn),我們可以更好地利用Go語言的并發(fā)特性,提高事件處理效率。8un28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-34683-0.htmlGo事件管理器:簡單實(shí)現(xiàn)

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 一文搞懂Go gRPC服務(wù)Handler單元測試

下一篇: 十個(gè)殺手級VS Code插件

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 乐平市| 贵南县| 交城县| 浠水县| 太白县| 余江县| 九江县| 宁晋县| 福贡县| 青州市| 台北县| 洪雅县| 呼伦贝尔市| 射阳县| 兴文县| 张家口市| 桂阳县| 通道| 汨罗市| 蒲城县| 乌鲁木齐县| 周口市| 阜康市| 兰坪| 吉林市| 奉贤区| 徐汇区| 石城县| 宽城| 抚宁县| 延庆县| 琼中| 浪卡子县| 鄂伦春自治旗| 平乡县| 缙云县| 吴堡县| 滨海县| 黑水县| 七台河市| 丘北县|