代码分享 - 基于 go 语言编写的 eventbus

774 阅读1分钟

// 空了再回来写思路,还有补充

基于 go 语言编写的 eventbus

import 'fmt'

type EventListenerCallback func(data string)

type EventListener struct{
    Callback EventListenerCallback
    IsOnce bool
}

type Emiter struct{
    eventMap map[string][]EventListener
}

func newEmiter() Emiter {
    return Emiter{
        eventMap: make(map[string][]EventListener),
    }
}

func (this *Emiter) on(event string, fn EventListenerCallback) {
    this.eventMap[event] = append(this.eventMap[event], EventListener{
        Callback: fn,
        IsOnce: false,
    })
}

func (this *Emiter) once(event string, fn EventListenerCallback) {
    this.eventMap[event] = append(this.eventMap[event], EventListener{
        Callback: fn,
        IsOnce: true,
    })
}

func (this *Emiter) emit(event string, msg string) {
    newEventList := []EventListener{}
    for _, eventListener := range this.eventMap[event]{
        eventListener.Callback(msg)
        if !eventListener.IsOnce{
            newEventList = append(newEventList, eventListener)
        }
    }

    this.eventMap[event] = newEventList
}

func main() {

    emit := newEmiter()
    emit.on("msg", func(data string){
        fmt.Println(data)
    })

    emit.once("msg", func(data string){
        fmt.Println("once", data)
    })

    emit.emit("msg", "hello world")
    emit.emit("msg", "hello world33333333")

}