# EventBus EventbBus是一个事件总线,用于在应用程序中处理事件。
## 源码: - [https://github.com/duke-git/lancet/blob/main/eventbus/eventbus.go](https://github.com/duke-git/lancet/blob/main/eventbus/eventbus.go) ## 用法: ```go import ( "github.com/duke-git/lancet/v2/eventbus" ) ``` ## 目录 - [NewEventBus](#NewEventBus) - [Subscribe](#Subscribe) - [Unsubscribe](#Unsubscribe) - [Publish](#Publish) - [ClearListeners](#ClearListeners) - [ClearListenersByTopic](#ClearListenersByTopic) - [GetListenersCount](#GetListenersCount) - [GetAllListenersCount](#GetAllListenersCount) - [GetEvents](#GetEvents) - [SetErrorHandler](#SetErrorHandler) ## 文档 ### NewEventBus创建EventBus实例。
函数签名: ```go func NewEventBus[T any]() *EventBus[T] ``` 示例:[运行](https://go.dev/play/p/gHbOPV_NUOJ) ```go import ( "fmt" "github.com/duke-git/lancet/v2/eventbus" ) func main() { eb := eventbus.NewEventBus[int]() receivedData := 0 listener := func(eventData int) { receivedData = eventData } eb.Subscribe("event1", listener, false, 0, nil) eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1}) fmt.Println(receivedData) // Output: // 1 } ``` ### Subscribe订阅具有特定事件主题和监听函数的事件。支持异步,事件优先级,事件过滤器。
函数签名: ```go func (eb *EventBus[T]) Subscribe(topic string, listener func(eventData T), async bool, priority int, filter func(eventData T) bool) ``` 示例:[运行](https://go.dev/play/p/EYGf_8cHei-) ```go import ( "fmt" "github.com/duke-git/lancet/v2/eventbus" ) func main() { eb := eventbus.NewEventBus[int]() receivedData := 0 listener := func(eventData int) { receivedData = eventData } filter := func(eventData int) bool { return eventData == 1 } eb.Subscribe("event1", listener, false, 0, filter) eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1}) eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 2}) fmt.Println(receivedData) // Output: // 1 } ``` ### Unsubscribe取消订阅具有特定事件主题的事件。
函数签名: ```go func (eb *EventBus[T]) Unsubscribe(topic string, listener func(eventData T)) ``` 示例:[运行](https://go.dev/play/p/Tmh7Ttfvprf) ```go import ( "fmt" "github.com/duke-git/lancet/v2/eventbus" ) func main() { eb := eventbus.NewEventBus[int]() receivedData := 0 listener := func(eventData int) { receivedData = eventData } eb.Subscribe("event1", listener, false, 0, nil) eb.Unsubscribe("event1", listener) eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1}) fmt.Println(receivedData) // Output: // 0 } ``` ### Publish发布一个带有特定事件主题和数据负载的事件。
函数签名: ```go func (eb *EventBus[T]) Publish(event eventbus.Event[T]) ``` 示例:[运行](https://go.dev/play/p/gHTtVexFSH9) ```go import ( "fmt" "github.com/duke-git/lancet/v2/eventbus" ) func main() { eb := eventbus.NewEventBus[int]() eb.Subscribe("event1", func(eventData int) { fmt.Println(eventData) }, false, 0, nil) eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1}) // Output: // 1 } ``` ### ClearListeners清空所有事件监听器。
函数签名: ```go func (eb *EventBus[T]) ClearListeners() ``` 示例:[运行](https://go.dev/play/p/KBfBYlKPgqD) ```go import ( "fmt" "github.com/duke-git/lancet/v2/eventbus" ) func main() { eb := eventbus.NewEventBus[int]() receivedData := 0 listener := func(eventData int) { receivedData = eventData } eb.Subscribe("event1", listener, false, 0, nil) eb.Subscribe("event2", listener, false, 0, nil) eb.ClearListeners() eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1}) eb.Publish(eventbus.Event[int]{Topic: "event2", Payload: 2}) fmt.Println(receivedData) // Output: // 0 } ``` ### ClearListenersByTopic清空特定事件监听器。
函数签名: ```go func (eb *EventBus[T]) ClearListenersByTopic(topic string) ``` 示例:[运行](https://go.dev/play/p/gvMljmJOZmU) ```go import ( "fmt" "github.com/duke-git/lancet/v2/eventbus" ) func main() { eb := eventbus.NewEventBus[int]() receivedData := 0 listener := func(eventData int) { receivedData = eventData } eb.Subscribe("event1", listener, false, 0, nil) eb.Subscribe("event2", listener, false, 0, nil) eb.ClearListenersByTopic("event1") eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1}) eb.Publish(eventbus.Event[int]{Topic: "event2", Payload: 2}) fmt.Println(receivedData) // Output: // 2 } ``` ### GetListenersCount获取特定事件的监听器数量。
函数签名: ```go func (eb *EventBus[T]) GetListenersCount(topic string) int ``` 示例:[运行](https://go.dev/play/p/j6yaJ2xAmFz) ```go import ( "fmt" "github.com/duke-git/lancet/v2/eventbus" ) func main() { eb := eventbus.NewEventBus[int]() eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) eb.Subscribe("event2", func(eventData int) {}, false, 0, nil) count := eb.GetListenersCount("event1") fmt.Println(count) // Output: // 1 } ``` ### GetAllListenersCount获取所有事件的监听器数量。
函数签名: ```go func (eb *EventBus[T]) GetAllListenersCount() int ``` 示例:[运行](https://go.dev/play/p/PUlr0xcpEOz) ```go import ( "fmt" "github.com/duke-git/lancet/v2/eventbus" ) func main() { eb := eventbus.NewEventBus[int]() eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) eb.Subscribe("event2", func(eventData int) {}, false, 0, nil) count := eb.GetAllListenersCount() fmt.Println(count) // Output: // 2 } ``` ### GetEvents获取所有事件的topic。
函数签名: ```go func (eb *EventBus[T]) GetEvents() []string ``` 示例:[运行](https://go.dev/play/p/etgjjcOtAjX) ```go import ( "fmt" "github.com/duke-git/lancet/v2/eventbus" ) func main() { eb := eventbus.NewEventBus[int]() eb.Subscribe("event1", func(eventData int) {}, false, 0, nil) eb.Subscribe("event2", func(eventData int) {}, false, 0, nil) events := eb.GetEvents() for _, event := range events { fmt.Println(event) } // Output: // event2 // event1 } ``` ### SetErrorHandler设置事件的错误处理函数。
函数签名: ```go func (eb *EventBus[T]) SetErrorHandler(handler func(err error)) ``` 示例:[运行](https://go.dev/play/p/gmB0gnFe5mc) ```go import ( "fmt" "github.com/duke-git/lancet/v2/eventbus" ) func main() { eb := eventbus.NewEventBus[int]() eb.SetErrorHandler(func(err error) { fmt.Println(err) }) eb.Subscribe("event1", func(eventData int) { panic("error") }, false, 0, nil) eb.Publish(eventbus.Event[int]{Topic: "event1", Payload: 1}) // Output: // error } ```