57 lines
1.1 KiB
Go
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)
|
|
}
|