event

package
v0.4.26 Latest Latest
Warning

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

Go to latest
Published: Mar 6, 2026 License: LGPL-2.1 Imports: 10 Imported by: 6

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

Constants

This section is empty.

Variables

View Source
var (
	ErrEvent = fmt.Errorf("%w: event", exception.ErrCore) // 事件错误
	ErrArgs  = exception.ErrArgs                          // 参数错误
)
View Source
var (
	// EventRecursionLimit 事件递归次数上限,超过此上限会panic
	EventRecursionLimit = 128
)

Functions

func Cache2Iface added in v0.3.42

func Cache2Iface[T any](c Cache) T

Cache2Iface 引用iface.Cache2Iface

func DeclareEventId added in v0.2.61

func DeclareEventId(eventTab any, pos int) uint64

DeclareEventId 声明事件Id

func DeclareEventIdT added in v0.2.62

func DeclareEventIdT[T any](pos int) uint64

DeclareEventIdT 声明事件Id

func DeclareEventTabId added in v0.2.61

func DeclareEventTabId(eventTab any) uint64

DeclareEventTabId 声明事件表Id

func DeclareEventTabIdT added in v0.2.62

func DeclareEventTabIdT[T any]() uint64

DeclareEventTabIdT 声明事件表Id

func GenEventId added in v0.4.25

func GenEventId(eventTab any, pos int) uint64

GenEventId 生成事件Id

func GenEventIdT added in v0.4.25

func GenEventIdT[T any](pos int) uint64

GenEventIdT 生成事件Id

func GenEventTabId added in v0.4.25

func GenEventTabId(eventTab any) uint64

GenEventTabId 生成事件表Id

func GenEventTabIdT added in v0.4.25

func GenEventTabIdT[T any]() uint64

GenEventTabIdT 生成事件表Id

func Panicf added in v0.3.42

func Panicf(format string, args ...any)

Panicf 引用exception.Panicf

func SplitEventId added in v0.4.25

func SplitEventId(eventId uint64) (eventTabId uint64, pos int)

SplitEventId 分解事件Id

func Unbind added in v0.2.58

func Unbind(event IEvent, subscriber any)

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 Cache added in v0.3.42

type Cache = iface.Cache

Cache 引用iface.Cache

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) Enabled added in v0.4.25

func (event *Event) Enabled() bool

Enabled 获取事件是否启用

func (*Event) PanicHandling added in v0.4.25

func (event *Event) PanicHandling() (autoRecover bool, reportError chan error)

PanicHandling 获取panic时的处理方式

func (*Event) Recursion added in v0.4.25

func (event *Event) Recursion() EventRecursion

Recursion 获取发生事件递归时的处理方式

func (*Event) SetEnabled added in v0.4.25

func (event *Event) SetEnabled(b bool)

SetEnabled 设置事件是否启用

func (*Event) SetPanicHandling added in v0.4.25

func (event *Event) SetPanicHandling(autoRecover bool, reportError chan error)

SetPanicHandling 设置panic时的处理方式

func (*Event) SetRecursion added in v0.4.25

func (event *Event) SetRecursion(recursion EventRecursion)

SetRecursion 设置发生事件递归时的处理方式

func (*Event) UnbindAll added in v0.4.9

func (event *Event) UnbindAll()

UnbindAll 解绑定所有订阅者

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()创建并返回的绑定句柄,请勿自己创建

func Bind added in v0.2.58

func Bind[T any](event IEvent, subscriber T, priority ...int32) Handle

Bind 绑定事件与订阅者,可以设置优先级调整回调先后顺序(升序)

func (Handle) Bound added in v0.4.25

func (handle Handle) Bound() bool

Bound 是否已绑定事件

func (Handle) Unbind added in v0.4.25

func (handle Handle) Unbind()

Unbind 解绑定事件与订阅者

type IEvent

type IEvent interface {
	// contains filtered or unexported methods
}

IEvent 事件接口

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 使用标签解绑定已托管的事件句柄

Directories

Path Synopsis
Package eventc 使用 go:generate 功能,在编译前自动化生成代码
Package eventc 使用 go:generate 功能,在编译前自动化生成代码

Jump to

Keyboard shortcuts

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