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

當前位置:首頁 > 科技  > 軟件

Go事件管理器:簡單實現

來源: 責編: 時間:2023-11-28 09:37:20 264觀看
導讀在編程中,事件管理器是一種常見的工具,用于通過通知來觸發操作。在Go語言中,我們可以通過創建事件管理器和監聽器來實現事件的處理。本文將介紹一個簡單的Go事件管理器的實現,并通過異步改進提高其性能。監聽器首先,我們需

在編程中,事件管理器是一種常見的工具,用于通過通知來觸發操作。在Go語言中,我們可以通過創建事件管理器和監聽器來實現事件的處理。本文將介紹一個簡單的Go事件管理器的實現,并通過異步改進提高其性能。B1728資訊網——每日最新資訊28at.com

監聽器

首先,我們需要創建一個監聽器。在這個實現中,監聽器只是一個接收事件參數的函數。B1728資訊網——每日最新資訊28at.com

type Listener[T any] func(T)

事件管理器

事件管理器是一個用于管理事件和監聽器的結構。它具有兩個方法:Add和Run。Add方法用于將新的監聽器附加到事件上,而Run方法用于執行事件管理器。B1728資訊網——每日最新資訊28at.com

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

抽象事件管理器

為了方便使用,我們可以創建一個抽象事件管理器,它實現了事件管理器接口的一部分通用邏輯。雖然Go語言并不是面向對象的,但我們可以通過模擬來實現類似的效果。B1728資訊網——每日最新資訊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方法用于添加監聽器和Invoke方法用于觸發指定事件的監聽器。B1728資訊網——每日最新資訊28at.com

具體事件管理器

下面是一個具體的事件管理器的示例實現:命令事件管理器。該管理器接收用戶從控制臺輸入的命令,并根據命令類型觸發相應的事件。B1728資訊網——每日最新資訊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方法獲取用戶從控制臺輸入的命令,并解析命令參數。如果沒有命令或者命令參數,則觸發"no-command"事件;否則,觸發"any-command"事件和具體命令的事件。B1728資訊網——每日最新資訊28at.com

添加監聽器

讓我們向命令事件管理器添加一些監聽器。B1728資訊網——每日最新資訊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()}

在上面的示例中,程序只執行一次,但你可以將其放在一個無限循環中以持續監聽命令。B1728資訊網——每日最新資訊28at.com

異步改進

可以將事件管理器的執行改為異步方式,以提高性能。每次執行事件時,可以將其作為一個goroutine進行處理。甚至可以將每個監聽器的執行也放在一個goroutine中,以提高并發性能。B1728資訊網——每日最新資訊28at.com

通過上述改進,我們可以更好地利用Go語言的并發特性,提高事件處理效率。B1728資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-34683-0.htmlGo事件管理器:簡單實現

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

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

下一篇: 十個殺手級VS Code插件

標簽:
  • 熱門焦點
  • 影音體驗是真的強 簡單聊聊iQOO Pad

    大公司的好處就是產品線豐富,非常細分化的東西也能給你做出來,例如早先我們看到了新的vivo Pad2,之后我們又在iQOO Neo8 Pro的發布會上看到了iQOO的首款平板產品iQOO Pad。雖
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 一篇文章帶你了解 CSS 屬性選擇器

    屬性選擇器對帶有指定屬性的 HTML 元素設置樣式。可以為擁有指定屬性的 HTML 元素設置樣式,而不僅限于 class 和 id 屬性。一、了解屬性選擇器CSS屬性選擇器提供了一種簡單而
  • 一個注解實現接口冪等,這樣才優雅!

    場景碼猿慢病云管理系統中其實高并發的場景不是很多,沒有必要每個接口都去考慮并發高的場景,比如添加住院患者的這個接口,具體的業務代碼就不貼了,業務偽代碼如下:圖片上述代碼有
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz“難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?”這一番話,出自百合網聯合創
  • 華為HarmonyOS 4升級計劃公布:首批34款機型今日開啟公測

    8月4日消息,今天下午華為正式發布了HarmonyOS 4系統,在更流暢的前提下,還帶來了不少新功能,UI設計也有變化,會讓手機煥然一新。華為宣布,首批機型將會在
  • iQOO Neo8系列或定檔5月23日:首發天璣9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列機型,不僅搭載了天璣9000+,而且是同價位唯一一款天璣9000+直屏旗艦,一經上市便受到了用戶的廣泛關注。在時隔半年后,
  • 2022爆款:ROG魔霸6 冰川散熱系統持續護航

    喜逢開學季,各大商家開始推出自己的新產品,進行打折促銷活動。對于忠實的端游愛好者來說,能夠擁有一款夢寐以求的筆記本電腦是一件十分開心的事。但是現在的
  • 最薄的14英寸游戲筆記本電腦 Alienware X14已可以購買

    2022年1月份在國際消費電子展(CES2022)上首次亮相的Alienware新品——Alienware X14現在已經可以購買了,這款筆記本電腦被譽為世界上最薄的 14 英寸游戲筆
Top 主站蜘蛛池模板: 曲周县| 潞城市| 诏安县| 体育| 喀喇沁旗| 绥宁县| 赤峰市| 哈尔滨市| 凭祥市| 荣成市| 云龙县| 东平县| 车险| 根河市| 蕉岭县| 长宁县| 汽车| 全南县| 长岛县| 吉首市| 广东省| 延川县| 前郭尔| 大丰市| 铜陵市| 靖安县| 新建县| 山东省| 南和县| 凉山| 丰原市| 大足县| 诏安县| 时尚| 邵阳县| 沁水县| 光山县| 常州市| 屏山县| 鄂托克前旗| 株洲县|