基于Go語言簡單實現(xiàn)事件管理器
在編程中,事件管理器是一種常見的工具,用于通過通知來觸發(fā)操作。在Go語言中,我們可以通過創(chuàng)建事件管理器和監(jiān)聽器來實現(xiàn)事件的處理。本文將介紹一個簡單的Go事件管理器的實現(xiàn),并通過異步改進提高其性能。
監(jiān)聽器
首先,我們需要創(chuàng)建一個監(jiān)聽器。在這個實現(xiàn)中,監(jiān)聽器只是一個接收事件參數(shù)的函數(shù)。
type Listener[T any] func(T)
事件管理器
事件管理器是一個用于管理事件和監(jiān)聽器的結構。它具有兩個方法:Add
和Run
。Add
方法用于將新的監(jiān)聽器附加到事件上,而Run
方法用于執(zhí)行事件管理器。
type Manager[T any] interface { Add(n string, l Listener[T]) Run() }
抽象事件管理器
為了方便使用,我們可以創(chuàng)建一個抽象事件管理器,它實現(xiàn)了事件管理器接口的一部分通用邏輯。雖然Go語言并不是面向對象的,但我們可以通過模擬來實現(xiàn)類似的效果。
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)聽器。
具體事件管理器
下面是一個具體的事件管理器的示例實現(xiàn):命令事件管理器。該管理器接收用戶從控制臺輸入的命令,并根據(jù)命令類型觸發(fā)相應的事件。
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
方法獲取用戶從控制臺輸入的命令,并解析命令參數(shù)。如果沒有命令或者命令參數(shù),則觸發(fā)"no-command"事件;否則,觸發(fā)"any-command"事件和具體命令的事件。
添加監(jiān)聽器
讓我們向命令事件管理器添加一些監(jiān)聽器。
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í)行一次,但你可以將其放在一個無限循環(huán)中以持續(xù)監(jiān)聽命令。
異步改進
可以將事件管理器的執(zhí)行改為異步方式,以提高性能。每次執(zhí)行事件時,可以將其作為一個goroutine
進行處理。甚至可以將每個監(jiān)聽器的執(zhí)行也放在一個goroutine
中,以提高并發(fā)性能。
通過上述改進,我們可以更好地利用Go語言的并發(fā)特性,提高事件處理效率。
到此這篇關于基于Go語言簡單實現(xiàn)事件管理器的文章就介紹到這了,更多相關go事件管理器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺析go中Ticker,Timer和Tick的用法與區(qū)別
在go面試的時候,面試官經常會問time包的Ticker,Timer以及Tick的區(qū)別,一般在超時控制的時候用的比較多,今天就跟隨小編一起來詳細學一下這幾個的區(qū)別吧2023-10-10Go中Gzip與json搭配實現(xiàn)數(shù)據(jù)壓縮demo
這篇文章主要為大家介紹了Go中Gzip與json搭配使用壓縮數(shù)據(jù)的實現(xiàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05使用golang生成prometheus格式數(shù)據(jù)
Prometheus是一個開源的監(jiān)控系統(tǒng),擁有許多Advanced?Feature,本文將介紹Primetheus?client的使用,并基于golang生成prometheus格式數(shù)據(jù),希望對大家有所幫助2025-02-02