用go写一个监听者模式
时间: 2023-04-09 07:02:33 浏览: 85
好的,我可以回答这个问题。在Go语言中,可以使用channel来实现监听者模式。首先定义一个事件结构体,包含事件名称和事件数据。然后定义一个事件监听器类型,包含一个channel和一个事件处理函数。当事件发生时,可以通过channel将事件发送给所有监听器,监听器收到事件后调用事件处理函数进行处理。以下是一个简单的示例代码:
```go
type Event struct {
Name string
Data interface{}
}
type Listener struct {
ch chan Event
handler func(Event)
}
func (l *Listener) Listen() {
for {
event := <-l.ch
l.handler(event)
}
}
func NewListener(handler func(Event)) *Listener {
return &Listener{
ch: make(chan Event),
handler: handler,
}
}
type Emitter struct {
listeners []*Listener
}
func (e *Emitter) AddListener(handler func(Event)) {
listener := NewListener(handler)
e.listeners = append(e.listeners, listener)
go listener.Listen()
}
func (e *Emitter) Emit(event Event) {
for _, listener := range e.listeners {
listener.ch <- event
}
}
```
使用示例:
```go
func main() {
emitter := &Emitter{}
listener1 := func(event Event) {
fmt.Printf("Listener1 received event %s: %v\n", event.Name, event.Data)
}
listener2 := func(event Event) {
fmt.Printf("Listener2 received event %s: %v\n", event.Name, event.Data)
}
emitter.AddListener(listener1)
emitter.AddListener(listener2)
emitter.Emit(Event{Name: "test", Data: "hello world"})
}
```
输出:
```
Listener1 received event test: hello world
Listener2 received event test: hello world
```
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://csdnimg.cn/download_wenku/file_type_lunwen.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)