signals

package
v0.1.8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 13, 2024 License: MIT Imports: 4 Imported by: 0

Documentation

Index

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]) IsEmpty

func (s *AsyncSignal[T]) IsEmpty() bool

IsEmpty 添加了并发安全的实现

func (*AsyncSignal[T]) Len

func (s *AsyncSignal[T]) Len() int

Len 添加了并发安全的实现

func (*AsyncSignal[T]) RemoveListener

func (s *AsyncSignal[T]) RemoveListener(key string) int

RemoveListener 添加了并发安全的实现

func (*AsyncSignal[T]) Reset

func (s *AsyncSignal[T]) Reset()

Reset 添加了并发安全的实现

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 类型的有效载荷。

func New

func New[T any]() Signal[T]

New 创建一个新的信号,可用于异步发射和监听事件。

示例:

signal := signals.New[int]()
signal.AddListener(func(ctx context.Context, payload int) {
    // 监听器实现
    // ...
})
signal.Emit(context.Background(), 42)

func NewSync

func NewSync[T any]() Signal[T]

NewSync 创建一个新的信号,可用于同步发射和监听事件。

示例:

signal := signals.NewSync[int]()
signal.AddListener(func(ctx context.Context, payload int) {
    // 监听器实现
    // ...
})
signal.Emit(context.Background(), 42)

type SignalListener

type SignalListener[T any] func(context.Context, T)

SignalListener 是一个类型定义,用于定义作为信号监听器的函数。 这个函数接受两个参数:

  1. 一个 `context.Context` 类型的上下文。这通常用于超时和取消信号, 并且可以在 API 边界和进程之间携带请求作用域的值。
  2. 一个泛型类型 `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]) IsEmpty

func (s *SyncSignal[T]) IsEmpty() bool

IsEmpty 添加了并发安全的实现

func (*SyncSignal[T]) Len

func (s *SyncSignal[T]) Len() int

Len 添加了并发安全的实现

func (*SyncSignal[T]) RemoveListener

func (s *SyncSignal[T]) RemoveListener(key string) int

RemoveListener 添加了并发安全的实现

func (*SyncSignal[T]) Reset

func (s *SyncSignal[T]) Reset()

Reset 添加了并发安全的实现

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL