This commit is contained in:
kingecg 2023-11-29 23:48:57 +08:00
parent 82dcecf1a1
commit 95a538dbfe
5 changed files with 135 additions and 0 deletions

16
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,16 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${fileDirname}"
}
]
}

View File

@ -1,2 +1,7 @@
# goemitter # goemitter
go 实现类似于Nodejs中的EventEmitter
在协程中执行回调

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module git.pyer.club/kingecg/goemitter
go 1.19

34
goemitter_test/main.go Normal file
View File

@ -0,0 +1,34 @@
package main
import (
"fmt"
emitter "git.pyer.club/kingecg/goemitter"
)
type St struct {
Name string
}
func (s *St) Print(data ...interface{}) {
fmt.Println(s.Name)
fmt.Println(data...)
}
func main() {
s := &St{Name: "testeer"}
em := emitter.NewEmitter()
em.On("test", func(data ...interface{}) {
fmt.Println(data...)
})
em.On("test", s.Print)
em.Once("test", func(data ...interface{}) {
s := fmt.Sprint(data...)
fmt.Println(interface{}("Once"), s)
})
em.EmitSync("test", "hello", "world")
em.Emit("test", "hello", "world2")
select {}
}

77
main.go Normal file
View File

@ -0,0 +1,77 @@
// Package goemitter
package goemitter
import (
"sync"
)
type EventEmitter struct {
callbacks map[string][]func(args ...interface{})
onceCallbacks map[string][]func(args ...interface{})
lock sync.Mutex
}
func (e *EventEmitter) On(event string, callback func(args ...interface{})) {
e.lock.Lock()
defer e.lock.Unlock()
if _, ok := e.callbacks[event]; !ok {
e.callbacks[event] = []func(args ...interface{}){callback}
} else {
e.callbacks[event] = append(e.callbacks[event], callback)
}
}
func (e *EventEmitter) Once(event string, callback func(args ...interface{})) {
e.lock.Lock()
defer e.lock.Unlock()
if _, ok := e.onceCallbacks[event]; !ok {
e.onceCallbacks[event] = append(e.onceCallbacks[event], callback)
}
}
func (e *EventEmitter) Emit(event string, data ...interface{}) {
e.lock.Lock()
defer e.lock.Unlock()
if callbacks, ok := e.callbacks[event]; ok {
for _, callback := range callbacks {
go callback(data...)
}
}
if onceCallbacks, ok := e.onceCallbacks[event]; ok {
for _, callback := range onceCallbacks {
go callback(data...)
}
e.onceCallbacks[event] = []func(args ...interface{}){}
}
}
func (e *EventEmitter) EmitSync(event string, data ...interface{}) {
e.lock.Lock()
defer e.lock.Unlock()
if callbacks, ok := e.callbacks[event]; ok {
for _, callback := range callbacks {
callback(data...)
}
}
if onceCallbacks, ok := e.onceCallbacks[event]; ok {
for _, callback := range onceCallbacks {
callback(data...)
}
e.onceCallbacks[event] = []func(args ...interface{}){}
}
}
func NewEmitter() *EventEmitter {
ret := &EventEmitter{}
ret.callbacks = make(map[string][]func(args ...interface{}))
ret.onceCallbacks = make(map[string][]func(args ...interface{}))
return ret
}