欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

在編程中,事件管理器是一種常見的工具,用于通過(guò)通知來(lái)觸發(fā)操作。在Go語(yǔ)言中,我們可以通過(guò)創(chuàng)建事件管理器和監(jiān)聽器來(lái)實(shí)現(xiàn)事件的處理。本文將介紹一個(gè)簡(jiǎn)單的Go事件管理器的實(shí)現(xiàn),并通過(guò)異步改進(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è)方法:AddRun。Add方法用于將新的監(jiān)聽器附加到事件上,而Run方法用于執(zhí)行事件管理器。

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

抽象事件管理器

為了方便使用,我們可以創(chuàng)建一個(gè)抽象事件管理器,它實(shí)現(xiàn)了事件管理器接口的一部分通用邏輯。雖然Go語(yǔ)言并不是面向?qū)ο蟮?,但我們可以通過(guò)模擬來(lái)實(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ù)。如果沒(méi)有命令或者命令參數(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è)無(wú)限循環(huán)中以持續(xù)監(jiān)聽命令。

異步改進(jìn)

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

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

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

相關(guān)文章

  • Go語(yǔ)言中錯(cuò)誤處理實(shí)例分析

    Go語(yǔ)言中錯(cuò)誤處理實(shí)例分析

    這篇文章主要介紹了Go語(yǔ)言中錯(cuò)誤處理,實(shí)例分析了Go語(yǔ)言中針對(duì)錯(cuò)誤處理的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • golang讀取yaml配置文件的方法實(shí)現(xiàn)

    golang讀取yaml配置文件的方法實(shí)現(xiàn)

    本文主要介紹了golang讀取yaml配置文件的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • 淺析go中Ticker,Timer和Tick的用法與區(qū)別

    淺析go中Ticker,Timer和Tick的用法與區(qū)別

    在go面試的時(shí)候,面試官經(jīng)常會(huì)問(wèn)time包的Ticker,Timer以及Tick的區(qū)別,一般在超時(shí)控制的時(shí)候用的比較多,今天就跟隨小編一起來(lái)詳細(xì)學(xué)一下這幾個(gè)的區(qū)別吧
    2023-10-10
  • 初探GO中unsafe包的使用

    初探GO中unsafe包的使用

    unsafe是Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的一個(gè)包,提供了一些不安全的編程操作,本文將深入探討Go語(yǔ)言中的unsafe包,介紹它的使用方法和注意事項(xiàng),感興趣的可以了解下
    2023-08-08
  • 詳解Golang中Context的三個(gè)常見應(yīng)用場(chǎng)景

    詳解Golang中Context的三個(gè)常見應(yīng)用場(chǎng)景

    Golang?context主要用于定義超時(shí)取消,取消后續(xù)操作,在不同操作中傳遞值。本文通過(guò)簡(jiǎn)單易懂的示例進(jìn)行說(shuō)明,感興趣的可以了解一下
    2022-12-12
  • Go中Gzip與json搭配實(shí)現(xiàn)數(shù)據(jù)壓縮demo

    Go中Gzip與json搭配實(shí)現(xiàn)數(shù)據(jù)壓縮demo

    這篇文章主要為大家介紹了Go中Gzip與json搭配使用壓縮數(shù)據(jù)的實(shí)現(xiàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 使用Go語(yǔ)言編寫簡(jiǎn)潔代碼的最佳實(shí)踐

    使用Go語(yǔ)言編寫簡(jiǎn)潔代碼的最佳實(shí)踐

    簡(jiǎn)潔的代碼對(duì)于創(chuàng)建可維護(hù)、可閱讀和高效的軟件至關(guān)重要,Go 是一種強(qiáng)調(diào)簡(jiǎn)單和代碼整潔的語(yǔ)言,在本文中,我們將結(jié)合代碼示例,探討編寫簡(jiǎn)潔 Go 代碼的最佳實(shí)踐,需要的朋友可以參考下
    2023-09-09
  • Go?gRPC教程實(shí)現(xiàn)Simple?RPC

    Go?gRPC教程實(shí)現(xiàn)Simple?RPC

    這篇文章主要為大家介紹了Go?gRPC教程實(shí)現(xiàn)Simple?RPC示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • golang sql連接池的實(shí)現(xiàn)方法詳解

    golang sql連接池的實(shí)現(xiàn)方法詳解

    database/sql是golang的標(biāo)準(zhǔn)庫(kù)之一,它提供了一系列接口方法,用于訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)。下面這篇文章主要給大家介紹了關(guān)于golang sql連接池用法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧
    2018-09-09
  • 使用golang生成prometheus格式數(shù)據(jù)

    使用golang生成prometheus格式數(shù)據(jù)

    Prometheus是一個(gè)開源的監(jiān)控系統(tǒng),擁有許多Advanced?Feature,本文將介紹Primetheus?client的使用,并基于golang生成prometheus格式數(shù)據(jù),希望對(duì)大家有所幫助
    2025-02-02

最新評(píng)論