Files
ArmedPolice/app/service/eventhub.go
2021-11-02 09:43:19 +08:00

57 lines
1.1 KiB
Go

package service
import (
"sync"
)
// listener 监听
type listener struct {
handler ListenerHandle
}
// listeners 监听器
type listeners struct {
listener map[interface{}]*listener
mutex *sync.RWMutex
}
// ListenerHandle 监听事件
type ListenerHandle interface {
Handle(args ...interface{})
}
// listenerObject 监听器
var listenerObject = &listeners{
listener: make(map[interface{}]*listener, 0),
mutex: new(sync.RWMutex),
}
// Subscribe 注册事件
func Subscribe(prefix interface{}, handler ListenerHandle) {
listenerObject.mutex.Lock()
defer listenerObject.mutex.Unlock()
listenerObject.listener[prefix] = &listener{handler: handler}
}
// Publish 推送事件
func Publish(prefix interface{}, args ...interface{}) {
listenerObject.mutex.RLock()
defer listenerObject.mutex.RUnlock()
listener, has := listenerObject.listener[prefix]
if !has {
return
}
listener.handler.Handle(args...)
}
// Unsubscribe 取消监听
func Unsubscribe(prefix interface{}) {
listenerObject.mutex.Lock()
defer listenerObject.mutex.Unlock()
_, has := listenerObject.listener[prefix]
if !has {
return
}
delete(listenerObject.listener, prefix)
}