1 Star 0 Fork 0

h79/goutils

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
bus.go 1.17 KB
一键复制 编辑 原始数据 按行查看 历史
huqiuyun 提交于 2022-08-20 14:42 . bus
package bus
import "sync"
type EventChan chan Event
var _ Publisher = (*Bus)(nil)
var _ Subscriber = (*Bus)(nil)
type Bus struct {
subscribers map[string][]EventChan
rm sync.RWMutex
}
func New() *Bus {
return &Bus{
subscribers: make(map[string][]EventChan, 0),
}
}
func (bus *Bus) Subscribe(topic string, ch EventChan) {
bus.rm.Lock()
defer bus.rm.Unlock()
if prev, found := bus.subscribers[topic]; found {
bus.subscribers[topic] = append(prev, ch)
} else {
bus.subscribers[topic] = append([]EventChan{}, ch)
}
}
func (bus *Bus) UnSubscribe(topic string, ch EventChan) {
bus.rm.Lock()
defer bus.rm.Unlock()
channels, found := bus.subscribers[topic]
if !found {
return
}
for i, c := range channels {
if c == ch {
channels = append(channels[:i], channels[i+1:]...)
}
}
}
func (bus *Bus) Start() error {
return nil
}
func (bus *Bus) Stop() {
}
func (bus *Bus) Publish(topic string, ev Event) {
bus.rm.RLock()
defer bus.rm.RUnlock()
ch, found := bus.subscribers[topic]
if !found {
return
}
channels := append([]EventChan{}, ch...)
go func(ev Event, channel []EventChan) {
for _, ch1 := range channel {
ch1 <- ev
}
}(ev, channels)
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/h79/goutils.git
git@gitee.com:h79/goutils.git
h79
goutils
goutils
v1.3.56

搜索帮助

344bd9b3 5694891 D2dac590 5694891