Documentation
¶
Overview ¶
Package event 高效的事件系统,适用于单线程环境,需要使用 go:generate 功能来生成代码。
定义事件:
1.按以下格式编写一个接口,即完成事件的定义:
type Event{事件名} interface {
On{事件名}({参数列表})
}
2.在定义事件的源码文件(.go)头部添加以下注释,在编译前自动化生成代码:
//go:generate go run git.golaxy.org/core/event/eventc event
使用事件:
1.事件一般作为组件的成员,在组件 Awake 时初始化,组件 Dispose 时关闭,示例如下:
type Comp struct {
ec.ComponentBehavior
event{事件名} event.Event
}
func (c *Comp) Awake() {
runtime.Current(c).ActivateEvent(&c.event{事件名}, event.EventRecursion_Discard)
}
func (c *Comp) Dispose() {
c.event{事件名}.Disable()
}
订阅事件:
1.在组件的成员函数,编写以下代码:
func (c *Comp) On{事件名}({参数列表}) {
...
}
2.在需要订阅事件时,编写以下代码:
func (c *Comp) MethodXXX() {
{事件定义包名}.Bind{事件名}({发布者}, c)
}
3.如果订阅者生命周期小于发布者,那么需要记录 handle 并且在 Dispose 时解除绑定,示例如下:
type Comp struct {
ec.ComponentBehavior
handle event.Handle
}
func (c *Comp) MethodXXX() {
c.handle = {事件定义包名}.Bind{事件名}({发布者}, c)
}
func (c *Comp) Dispose() {
c.handle.Unbind()
}
4.如果不想写代码记录 handle,可以使用 ec.Component、ec.Entity 或 runtime.Context 的 ManagedAddEventHandles() 来记录 handle,在它们生命周期结束时,将会自动解除绑定
定义事件表:
1.在定义事件的源码文件(.go)头部添加以下注释,在编译前自动化生成代码:
//go:generate go run git.golaxy.org/core/event/eventc eventtab --name={事件表名称}
事件的选项(添加到定义事件的注释里):
1.发送事件的代码的可见性 +event-gen:export_emit=[0,1] 2.是否生成简化绑定事件的代码 +event-gen:auto=[0,1] 3.事件表初始化时,该事件使用的递归处理方式,不填表示使用事件表初始化参数值 +event-tab-gen:recursion=[allow,disallow,discard,skip_received,receive_once]
Index ¶
- Variables
- func Cache2Iface[T any](c Cache) T
- func DeclareEventId(eventTab any, pos int) uint64
- func DeclareEventIdT[T any](pos int) uint64
- func DeclareEventTabId(eventTab any) uint64
- func DeclareEventTabIdT[T any]() uint64
- func GenEventId(eventTab any, pos int) uint64
- func GenEventIdT[T any](pos int) uint64
- func GenEventTabId(eventTab any) uint64
- func GenEventTabIdT[T any]() uint64
- func Panicf(format string, args ...any)
- func SplitEventId(eventId uint64) (eventTabId uint64, pos int)
- func Unbind(event IEvent, subscriber any)
- func UnbindHandles(handles []Handle)
- func UnsafeEvent(event IEvent) _UnsafeEventdeprecated
- type Cache
- type CombineEventTab
- func (c *CombineEventTab) Ctrl() IEventCtrl
- func (c *CombineEventTab) Event(id uint64) IEvent
- func (c *CombineEventTab) SetEnabled(b bool)
- func (c *CombineEventTab) SetPanicHandling(autoRecover bool, reportError chan error)
- func (c *CombineEventTab) SetRecursion(recursion EventRecursion)
- func (c *CombineEventTab) UnbindAll()
- type Event
- func (event *Event) Enabled() bool
- func (event *Event) PanicHandling() (autoRecover bool, reportError chan error)
- func (event *Event) Recursion() EventRecursion
- func (event *Event) SetEnabled(b bool)
- func (event *Event) SetPanicHandling(autoRecover bool, reportError chan error)
- func (event *Event) SetRecursion(recursion EventRecursion)
- func (event *Event) UnbindAll()
- type EventRecursion
- type Handle
- type IEvent
- type IEventCtrl
- type IEventTab
- type ManagedHandles
- func (m *ManagedHandles) AddEventHandles(handles ...Handle)
- func (m *ManagedHandles) AddTaggedEventHandles(tag string, handles ...Handle)
- func (m *ManagedHandles) ClearAllUnboundEventHandles()
- func (m *ManagedHandles) GetEventHandles() []Handle
- func (m *ManagedHandles) GetTaggedEventHandles(tag string) []Handle
- func (m *ManagedHandles) UnbindAllEventHandles()
- func (m *ManagedHandles) UnbindEventHandles()
- func (m *ManagedHandles) UnbindTaggedEventHandles(tag string)
Constants ¶
This section is empty.
Variables ¶
var ( ErrEvent = fmt.Errorf("%w: event", exception.ErrCore) // 事件错误 ErrArgs = exception.ErrArgs // 参数错误 )
var (
// EventRecursionLimit 事件递归次数上限,超过此上限会panic
EventRecursionLimit = 128
)
Functions ¶
func Cache2Iface ¶ added in v0.3.42
Cache2Iface 引用iface.Cache2Iface
func DeclareEventId ¶ added in v0.2.61
DeclareEventId 声明事件Id
func DeclareEventIdT ¶ added in v0.2.62
DeclareEventIdT 声明事件Id
func DeclareEventTabId ¶ added in v0.2.61
DeclareEventTabId 声明事件表Id
func DeclareEventTabIdT ¶ added in v0.2.62
DeclareEventTabIdT 声明事件表Id
func SplitEventId ¶ added in v0.4.25
SplitEventId 分解事件Id
func Unbind ¶ added in v0.2.58
Unbind 解绑定事件与订阅者,在同个订阅者多次绑定事件的情况下,会以逆序依次解除,正常情况下应该使用事件句柄(Handle)解绑定,不应该使用该函数
func UnbindHandles ¶ added in v0.4.25
func UnbindHandles(handles []Handle)
UnbindHandles 解绑定事件句柄(Handle)
func UnsafeEvent
deprecated
func UnsafeEvent(event IEvent) _UnsafeEvent
Deprecated: UnsafeEvent 访问事件内部方法
Types ¶
type CombineEventTab ¶ added in v0.2.71
type CombineEventTab []IEventTab
CombineEventTab 联合事件表,可以将多个事件表联合在一起,方便管理多个事件表
func (*CombineEventTab) Ctrl ¶ added in v0.3.49
func (c *CombineEventTab) Ctrl() IEventCtrl
Ctrl 事件控制器
func (*CombineEventTab) Event ¶ added in v0.3.48
func (c *CombineEventTab) Event(id uint64) IEvent
Event 获取事件
func (*CombineEventTab) SetEnabled ¶ added in v0.4.25
func (c *CombineEventTab) SetEnabled(b bool)
SetEnabled 设置事件是否启用
func (*CombineEventTab) SetPanicHandling ¶ added in v0.4.25
func (c *CombineEventTab) SetPanicHandling(autoRecover bool, reportError chan error)
SetPanicHandling 设置panic时的处理方式
func (*CombineEventTab) SetRecursion ¶ added in v0.4.25
func (c *CombineEventTab) SetRecursion(recursion EventRecursion)
SetRecursion 设置发生事件递归时的处理方式
func (*CombineEventTab) UnbindAll ¶ added in v0.4.9
func (c *CombineEventTab) UnbindAll()
UnbindAll 解绑定所有订阅者
type Event ¶
type Event struct {
// contains filtered or unexported fields
}
Event 事件
func (*Event) PanicHandling ¶ added in v0.4.25
PanicHandling 获取panic时的处理方式
func (*Event) Recursion ¶ added in v0.4.25
func (event *Event) Recursion() EventRecursion
Recursion 获取发生事件递归时的处理方式
func (*Event) SetEnabled ¶ added in v0.4.25
SetEnabled 设置事件是否启用
func (*Event) SetPanicHandling ¶ added in v0.4.25
SetPanicHandling 设置panic时的处理方式
func (*Event) SetRecursion ¶ added in v0.4.25
func (event *Event) SetRecursion(recursion EventRecursion)
SetRecursion 设置发生事件递归时的处理方式
type EventRecursion ¶
type EventRecursion int8
EventRecursion 发生事件递归时的处理方式(事件递归:事件发送过程中,在订阅者的逻辑中,再次发送这个事件)
const ( EventRecursion_Allow EventRecursion = iota // 允许事件递归,可能会无限递归 EventRecursion_Disallow // 不允许事件递归,递归时会panic EventRecursion_Discard // 丢弃递归的事件,不会再发送给任何订阅者 EventRecursion_SkipReceived // 发送递归事件时跳过已接收事件的订阅者 EventRecursion_ReceiveOnce // 订阅者在整个事件发送过程中只接收一次 )
type Handle ¶ added in v0.4.25
type Handle struct {
// contains filtered or unexported fields
}
Handle 事件句柄,由BindEvent()创建并返回的绑定句柄,请勿自己创建
type IEventCtrl ¶
type IEventCtrl interface {
// SetPanicHandling 设置panic时的处理方式
SetPanicHandling(autoRecover bool, reportError chan error)
// SetRecursion 设置发生事件递归时的处理方式
SetRecursion(recursion EventRecursion)
// SetEnabled 设置事件是否启用
SetEnabled(b bool)
// UnbindAll 解绑定所有订阅者
UnbindAll()
}
IEventCtrl 事件控制器接口
type IEventTab ¶
type IEventTab interface {
// Ctrl 事件控制器
Ctrl() IEventCtrl
// Event 获取事件
Event(id uint64) IEvent
}
IEventTab 事件表接口,方便管理多个事件
type ManagedHandles ¶ added in v0.4.25
type ManagedHandles struct {
// contains filtered or unexported fields
}
ManagedHandles 托管事件句柄
func (*ManagedHandles) AddEventHandles ¶ added in v0.4.25
func (m *ManagedHandles) AddEventHandles(handles ...Handle)
AddEventHandles 托管事件句柄
func (*ManagedHandles) AddTaggedEventHandles ¶ added in v0.4.25
func (m *ManagedHandles) AddTaggedEventHandles(tag string, handles ...Handle)
AddTaggedEventHandles 使用标签托管事件句柄
func (*ManagedHandles) ClearAllUnboundEventHandles ¶ added in v0.4.25
func (m *ManagedHandles) ClearAllUnboundEventHandles()
ClearAllUnboundEventHandles 清除所有已失效的事件句柄
func (*ManagedHandles) GetEventHandles ¶ added in v0.4.25
func (m *ManagedHandles) GetEventHandles() []Handle
GetEventHandles 获取已托管的事件句柄
func (*ManagedHandles) GetTaggedEventHandles ¶ added in v0.4.25
func (m *ManagedHandles) GetTaggedEventHandles(tag string) []Handle
GetTaggedEventHandles 使用标签获取已托管的事件句柄
func (*ManagedHandles) UnbindAllEventHandles ¶ added in v0.4.25
func (m *ManagedHandles) UnbindAllEventHandles()
UnbindAllEventHandles 解绑定所有已托管的事件句柄
func (*ManagedHandles) UnbindEventHandles ¶ added in v0.4.25
func (m *ManagedHandles) UnbindEventHandles()
UnbindEventHandles 解绑定已托管的事件句柄
func (*ManagedHandles) UnbindTaggedEventHandles ¶ added in v0.4.25
func (m *ManagedHandles) UnbindTaggedEventHandles(tag string)
UnbindTaggedEventHandles 使用标签解绑定已托管的事件句柄