最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Go語言簡單實(shí)現(xiàn)事件管理器

 更新時(shí)間:2023年11月27日 09:24:43   作者:洛天楓  
在編程中,事件管理器是一種常見的工具,用于通過通知來觸發(fā)操作,本文將介紹一個(gè)簡單的Go事件管理器的實(shí)現(xiàn),并通過異步改進(jìn)提高其性能,感興趣的可以了解下

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

監(jiān)聽器

首先,我們需要?jiǎng)?chuàng)建一個(gè)監(jiān)聽器。在這個(gè)實(shí)現(xiàn)中,監(jiān)聽器只是一個(gè)接收事件參數(shù)的函數(shù)。

type Listener[T any] func(T)

事件管理器

事件管理器是一個(gè)用于管理事件和監(jiān)聽器的結(jié)構(gòu)。它具有兩個(gè)方法:AddRunAdd方法用于將新的監(jiān)聽器附加到事件上,而Run方法用于執(zhí)行事件管理器。

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

抽象事件管理器

為了方便使用,我們可以創(chuàng)建一個(gè)抽象事件管理器,它實(shí)現(xiàn)了事件管理器接口的一部分通用邏輯。雖然Go語言并不是面向?qū)ο蟮?,但我們可以通過模擬來實(shí)現(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)聽器。

具體事件管理器

下面是一個(gè)具體的事件管理器的示例實(shí)現(xiàn):命令事件管理器。該管理器接收用戶從控制臺(tái)輸入的命令,并根據(jù)命令類型觸發(fā)相應(yīng)的事件。

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"事件和具體命令的事件。

添加監(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í)行一次,但你可以將其放在一個(gè)無限循環(huán)中以持續(xù)監(jiān)聽命令。

異步改進(jìn)

可以將事件管理器的執(zhí)行改為異步方式,以提高性能。每次執(zhí)行事件時(shí),可以將其作為一個(gè)goroutine進(jìn)行處理。甚至可以將每個(gè)監(jiān)聽器的執(zhí)行也放在一個(gè)goroutine中,以提高并發(fā)性能。

通過上述改進(jìn),我們可以更好地利用Go語言的并發(fā)特性,提高事件處理效率。

到此這篇關(guān)于基于Go語言簡單實(shí)現(xiàn)事件管理器的文章就介紹到這了,更多相關(guān)go事件管理器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang二維數(shù)組的使用方式

    Golang二維數(shù)組的使用方式

    之前給大家講過很多二維數(shù)組的知識(shí),今天重點(diǎn)給大家介紹Golang二維數(shù)組的使用方式,通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-05-05
  • 源碼分析Go語言中g(shù)ofmt實(shí)現(xiàn)原理

    源碼分析Go語言中g(shù)ofmt實(shí)現(xiàn)原理

    gofmt?是?Go?語言官方提供的一個(gè)工具,用于自動(dòng)格式化?Go?源代碼,使其符合?Go?語言的官方編碼風(fēng)格,本文給大家源碼詳細(xì)分析了Go語言中g(shù)ofmt實(shí)現(xiàn)原理,并通過圖文和代碼講解的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • golang常用庫之pkg/errors包第三方錯(cuò)誤處理包案例詳解

    golang常用庫之pkg/errors包第三方錯(cuò)誤處理包案例詳解

    這篇文章主要介紹了golang常用庫之pkg/errors包第三方錯(cuò)誤處理包,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Go語言操作Excel利器之excelize類庫詳解

    Go語言操作Excel利器之excelize類庫詳解

    Excelize是Go語言編寫的用于操作Office Excel文檔基礎(chǔ)庫,基于ECMA-376,ISO/IEC 29500國際標(biāo)準(zhǔn),可以使用它來讀取、寫入由Excel 2007及以上版本創(chuàng)建的電子表格文檔,下面這篇文章主要給大家介紹了關(guān)于Go語言操作Excel利器之excelize類庫的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Golang中的錯(cuò)誤處理的示例詳解

    Golang中的錯(cuò)誤處理的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Golang中的錯(cuò)誤處理的相關(guān)資料,文章中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Golang有一定幫助,需要的可以參考一下
    2022-11-11
  • Go語言中的延遲函數(shù)defer示例詳解

    Go語言中的延遲函數(shù)defer示例詳解

    眾所周知golang的defer優(yōu)雅又簡潔, 是golang的亮點(diǎn)之一。所以下面這篇文章主要給大家介紹了關(guān)于Go語言中延遲函數(shù)defer的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • go使用Cron定時(shí)實(shí)現(xiàn)recover機(jī)制

    go使用Cron定時(shí)實(shí)現(xiàn)recover機(jī)制

    本文主要介紹了go使用Cron定時(shí)實(shí)現(xiàn)recover機(jī)制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • GoLang編程必備:GoFrame?GoLand插件介紹

    GoLang編程必備:GoFrame?GoLand插件介紹

    掌握GoLang編程必備工具,我們來深入了解GoFrame?GoLand插件,這個(gè)小巧但強(qiáng)大的插件將極大提升你的開發(fā)效率,讓代碼流暢如行云流水,一起跟隨本指南,解鎖更智能的編程之旅!
    2023-12-12
  • Goland?Gin?框架中的表單處理與數(shù)據(jù)綁定的操作方法

    Goland?Gin?框架中的表單處理與數(shù)據(jù)綁定的操作方法

    本文詳細(xì)介紹了Gin框架中表單處理的功能,包括數(shù)據(jù)綁定、驗(yàn)證和文件上傳等,并通過一個(gè)完整的用戶注冊(cè)項(xiàng)目示例展示了實(shí)際應(yīng)用,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Golang?中的?unsafe.Pointer?和?uintptr詳解

    Golang?中的?unsafe.Pointer?和?uintptr詳解

    這篇文章主要介紹了Golang中的unsafe.Pointer和uintptr詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08

最新評(píng)論

富民县| 玉山县| 琼海市| 广州市| 洛扎县| 镇平县| 武山县| 松溪县| 庄浪县| 平武县| 甘泉县| 孟村| 承德市| 汾西县| 大同市| 西华县| 泰安市| 柘城县| 普安县| 丹阳市| 滁州市| 清远市| 明溪县| 庆元县| 乌审旗| 翁源县| 城市| 凭祥市| 临夏市| 伊通| 阿巴嘎旗| 平远县| 安福县| 加查县| 秦皇岛市| 平湖市| 乐昌市| 中江县| 昆明市| 丰都县| 中方县|