Documentation
¶
Index ¶
- type AsyncSignal
- func (s *AsyncSignal[T]) AddListener(listener SignalListener[T], key ...string) int
- func (s *AsyncSignal[T]) Emit(ctx context.Context, payload T) error
- func (s *AsyncSignal[T]) IsEmpty() bool
- func (s *AsyncSignal[T]) Len() int
- func (s *AsyncSignal[T]) RemoveListener(key string) int
- func (s *AsyncSignal[T]) Reset()
- type BaseSignal
- type Signal
- type SignalListener
- type SyncSignal
- func (s *SyncSignal[T]) AddListener(listener SignalListener[T], key ...string) int
- func (s *SyncSignal[T]) Emit(ctx context.Context, payload T) error
- func (s *SyncSignal[T]) IsEmpty() bool
- func (s *SyncSignal[T]) Len() int
- func (s *SyncSignal[T]) RemoveListener(key string) int
- func (s *SyncSignal[T]) Reset()
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AsyncSignal ¶
type AsyncSignal[T any] struct { BaseSignal[T] // contains filtered or unexported fields }
AsyncSignal 是实现 Signal 接口的结构体。 这是默认实现。它提供与 SyncSignal 相同的功能, 但监听器是在单独的 goroutine 中调用的。 这意味着所有监听器都是异步调用的。但是,该方法 在返回之前等待所有监听器完成。如果你不想 等待监听器完成,你可以在单独的 goroutine 中调用 Emit 方法。
func (*AsyncSignal[T]) AddListener ¶
func (s *AsyncSignal[T]) AddListener(listener SignalListener[T], key ...string) int
AddListener 添加了并发安全的实现
func (*AsyncSignal[T]) Emit ¶
func (s *AsyncSignal[T]) Emit(ctx context.Context, payload T) error
Emit 以异步方式通知所有信号订阅者并传递负载。
如果上下文有截止日期或可取消属性,监听器必须遵守它。 这意味着当上下文被取消时,监听器应停止处理。 在发射时,它在单独的 goroutine 中调用监听器,所以监听器是异步调用的。 然而,它在返回之前等待所有监听器完成。如果你不想 等待监听器完成,你可以在单独的 goroutine 中调用 Emit 方法。 另外,你必须知道 Emit 不保证发射值的类型安全。
示例:
signal := signals.New[string]()
signal.AddListener(func(ctx context.Context, payload string) {
// 监听器实现
// ...
})
signal.Emit(context.Background(), "Hello, world!")
func (*AsyncSignal[T]) RemoveListener ¶
func (s *AsyncSignal[T]) RemoveListener(key string) int
RemoveListener 添加了并发安全的实现
type BaseSignal ¶
type BaseSignal[T any] struct { // contains filtered or unexported fields }
BaseSignal 提供 Signal 接口的基本实现。 它旨在用作底层信号机制的抽象基础。
示例:
type MyDerivedSignal[T any] struct {
BaseSignal[T]
// MyDerivedSignal 特有的其他字段或方法
}
func (s *MyDerivedSignal[T]) Emit(ctx context.Context, payload T) {
// 发射信号的自定义实现
}
func (*BaseSignal[T]) AddListener ¶
func (s *BaseSignal[T]) AddListener(listener SignalListener[T], key ...string) int
AddListener 向信号添加监听器。每当信号被发射时,监听器将被调用。 它返回添加监听器后的订阅者数量。它接受一个可选的键, 该键可以用于以后移除监听器或检查监听器是否已经被添加。 如果具有相同键的监听器已经添加到信号中,则返回 -1。
示例:
signal := signals.New[int]()
count := signal.AddListener(func(ctx context.Context, payload int) {
// 监听器实现
// ...
}, "key1")
fmt.Println("添加监听器后的订阅者数量:", count)
func (*BaseSignal[T]) IsEmpty ¶
func (s *BaseSignal[T]) IsEmpty() bool
IsEmpty 检查信号是否有任何订阅者。 如果信号没有订阅者,则返回 true,否则返回 false。 这可以用来在发射信号之前检查是否有任何监听器。
示例:
signal := signals.New[int]()
fmt.Println("信号是否为空?", signal.IsEmpty()) // 应打印 true
signal.AddListener(func(ctx context.Context, payload int) {
// 监听器实现
// ...
})
fmt.Println("信号是否为空?", signal.IsEmpty()) // 应打印 false
func (*BaseSignal[T]) Len ¶
func (s *BaseSignal[T]) Len() int
Len 返回订阅信号的监听器数量。 这可以用来检查当前有多少监听器在等待信号。 返回值类型为 int。
示例:
signal := signals.New[int]()
signal.AddListener(func(ctx context.Context, payload int) {
// 监听器实现
// ...
})
fmt.Println("订阅者数量:", signal.Len())
func (*BaseSignal[T]) RemoveListener ¶
func (s *BaseSignal[T]) RemoveListener(key string) int
RemoveListener 从信号中移除监听器。 它返回移除监听器后的订阅者数量。如果未找到监听器,则返回 -1。
示例:
signal := signals.New[int]()
signal.AddListener(func(ctx context.Context, payload int) {
// 监听器实现
// ...
}, "key1")
count := signal.RemoveListener("key1")
fmt.Println("移除监听器后的订阅者数量:", count)
func (*BaseSignal[T]) Reset ¶
func (s *BaseSignal[T]) Reset()
Reset 通过从信号中移除所有订阅者来重置信号, 有效地清除订阅者列表。 当你想停止所有监听器接收进一步的信号时,可以使用此方法。
示例:
signal := signals.New[int]()
signal.AddListener(func(ctx context.Context, payload int) {
// 监听器实现
// ...
})
signal.Reset() // 移除所有监听器
fmt.Println("重置后的订阅者数量:", signal.Len())
type Signal ¶
type Signal[T any] interface { // Emit 通知信号的所有订阅者,并传递上下文和有效载荷。 // // 如果上下文有截止日期或可取消属性,监听器必须遵守它。 // 如果信号是异步的(默认),监听器将在单独的 goroutine 中被调用。 // // 示例: // signal := signals.New[int]() // signal.AddListener(func(ctx context.Context, payload int) { // // 监听器实现 // // ... // }) // signal.Emit(context.Background(), 42) Emit(ctx context.Context, payload T) error // AddListener 向信号添加一个监听器。 // // 每当信号被发出时,监听器将被调用。它返回添加监听器后的订阅者数量。 // 它接受一个可选的键,可用于稍后删除监听器或检查监听器是否已添加。 // 如果具有相同键的监听器已添加到信号中,则返回 -1。 // // 示例: // signal := signals.NewSync[int]() // count := signal.AddListener(func(ctx context.Context, payload int) { // // 监听器实现 // // ... // }) // fmt.Println("添加监听器后的订阅者数量:", count) AddListener(handler SignalListener[T], key ...string) int // RemoveListener 从信号中移除监听器。 // // 它返回移除监听器后的订阅者数量。 // 如果未找到监听器,则返回 -1。 // // 示例: // signal := signals.NewSync[int]() // signal.AddListener(func(ctx context.Context, payload int) { // // 监听器实现 // // ... // }, "key1") // count := signal.RemoveListener("key1") // fmt.Println("移除监听器后的订阅者数量:", count) RemoveListener(key string) int // Reset 通过移除所有订阅者来重置信号, // 有效地清除订阅者列表。 // // 当您想停止所有监听器接收更多信号时,可以使用此方法。 // // 示例: // signal := signals.New[int]() // signal.AddListener(func(ctx context.Context, payload int) { // // 监听器实现 // // ... // }) // signal.Reset() // 移除所有监听器 // fmt.Println("重置后的订阅者数量:", signal.Len()) Reset() // Len 返回订阅信号的监听器数量。 // // 这可用于检查当前有多少监听器在等待信号。 // 返回值类型为 int。 // // 示例: // signal := signals.NewSync[int]() // signal.AddListener(func(ctx context.Context, payload int) { // // 监听器实现 // // ... // }) // fmt.Println("订阅者数量:", signal.Len()) Len() int // IsEmpty 检查信号是否有任何订阅者。 // // 如果信号没有订阅者,则返回 true,否则返回 false。 // 这可用于在发出信号之前检查是否有任何监听器。 // // 示例: // signal := signals.New[int]() // fmt.Println("信号是否为空?", signal.IsEmpty()) // 应打印 true // signal.AddListener(func(ctx context.Context, payload int) { // // 监听器实现 // // ... // }) // fmt.Println("信号是否为空?", signal.IsEmpty()) // 应打印 false IsEmpty() bool }
Signal 是表示可以订阅的信号的接口,该信号发出 T 类型的有效载荷。
type SignalListener ¶
SignalListener 是一个类型定义,用于定义作为信号监听器的函数。 这个函数接受两个参数:
- 一个 `context.Context` 类型的上下文。这通常用于超时和取消信号, 并且可以在 API 边界和进程之间携带请求作用域的值。
- 一个泛型类型 `T` 的有效载荷。这可以是任何类型,表示监听器函数 将要处理的数据或信号。
该函数不返回任何值。
type SyncSignal ¶
type SyncSignal[T any] struct { BaseSignal[T] // contains filtered or unexported fields }
SyncSignal 是实现 Signal 接口的结构体。 它提供了一种同步方式来通知所有信号订阅者。 类型参数 `T` 是任意类型的占位符。
func (*SyncSignal[T]) AddListener ¶
func (s *SyncSignal[T]) AddListener(listener SignalListener[T], key ...string) int
AddListener 添加了并发安全的实现
func (*SyncSignal[T]) Emit ¶
func (s *SyncSignal[T]) Emit(ctx context.Context, payload T) error
Emit 以同步方式通知所有信号订阅者并传递负载。
负载的类型与 SyncSignal 的类型参数 `T` 相同。 该方法遍历 SyncSignal 的订阅者切片, 对于每个订阅者,它调用订阅者的监听器函数, 传递上下文和负载。 如果上下文有截止日期或可取消属性,监听器必须遵守它。 这意味着当上下文被取消时,监听器应停止处理。 与 AsyncSignal 的 Emit 方法不同,此方法不会在单独的 goroutine 中调用监听器, 因此监听器是同步调用的,一个接一个。
示例:
signal := signals.NewSync[string]()
signal.AddListener(func(ctx context.Context, payload string) {
// 监听器实现
// ...
})
err := signal.Emit(context.Background(), "Hello, world!")
if err != nil {
// 处理错误
}
func (*SyncSignal[T]) RemoveListener ¶
func (s *SyncSignal[T]) RemoveListener(key string) int
RemoveListener 添加了并发安全的实现