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) }