event

package
v0.3.22 Latest Latest
Warning

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

Go to latest
Published: Aug 10, 2024 License: LGPL-2.1 Imports: 8 Imported by: 1

Documentation

Overview

Package event 高效的事件系统,适用于单线程环境,需要使用go:generate功能来生成代码。

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 = int32(128)
)

Functions

func Clean added in v0.2.58

func Clean(hooks []Hook)

Clean 清理Hooks

func DeclareEventId added in v0.2.61

func DeclareEventId(eventTab IEventTab, pos int32) uint64

DeclareEventId 声明事件Id

func DeclareEventIdT added in v0.2.62

func DeclareEventIdT[T any](pos int32) uint64

DeclareEventIdT 声明事件Id

func DeclareEventTabId added in v0.2.61

func DeclareEventTabId(eventTab IEventTab) uint64

DeclareEventTabId 声明事件表Id

func DeclareEventTabIdT added in v0.2.62

func DeclareEventTabIdT[T any]() uint64

DeclareEventTabIdT 声明事件表Id

func MakeEventId added in v0.2.61

func MakeEventId(eventTab IEventTab, pos int32) uint64

MakeEventId 创建事件Id

func MakeEventIdT added in v0.2.62

func MakeEventIdT[T any](pos int32) uint64

MakeEventIdT 创建事件Id

func MakeEventTabId added in v0.2.61

func MakeEventTabId(eventTab IEventTab) uint64

MakeEventTabId 创建事件表Id

func MakeEventTabIdT added in v0.2.62

func MakeEventTabIdT[T any]() uint64

MakeEventTabIdT 创建事件表Id

func Unbind added in v0.2.58

func Unbind(event IEvent, subscriber any)

Unbind 解绑定事件与订阅者,在同个订阅者多次绑定事件的情况下,会以逆序依次解除,正常情况下应该使用事件钩子(Hook)解绑定,不应该使用该函数

func UnsafeEvent deprecated

func UnsafeEvent(event IEvent) _UnsafeEvent

Deprecated: UnsafeEvent 访问事件内部方法

Types

type CombineEventTab added in v0.2.71

type CombineEventTab []IEventTab

CombineEventTab 联合事件表,可以将多个事件表联合在一起,方便管理多个事件表

func (*CombineEventTab) Clean added in v0.2.71

func (c *CombineEventTab) Clean()

Clean 清除全部订阅者

func (*CombineEventTab) Close added in v0.2.71

func (c *CombineEventTab) Close()

Close 关闭事件

func (*CombineEventTab) Get added in v0.2.71

func (c *CombineEventTab) Get(id uint64) IEvent

Get 获取事件

func (*CombineEventTab) Init added in v0.2.71

func (c *CombineEventTab) Init(autoRecover bool, reportError chan error, recursion EventRecursion)

Init 初始化事件

func (*CombineEventTab) Open added in v0.2.71

func (c *CombineEventTab) Open()

Open 打开事件

type Event

type Event struct {
	// contains filtered or unexported fields
}

Event 事件

func (*Event) Clean

func (event *Event) Clean()

Clean 清除全部订阅者

func (*Event) Close

func (event *Event) Close()

Close 关闭事件

func (*Event) Init

func (event *Event) Init(autoRecover bool, reportError chan error, eventRecursion EventRecursion)

Init 初始化事件

func (*Event) Open

func (event *Event) Open()

Open 打开事件

type EventRecursion

type EventRecursion int32

EventRecursion 发生事件递归时的处理方式(事件递归:事件发送过程中,在订阅者的逻辑中,再次发送这个事件)

const (
	EventRecursion_Allow    EventRecursion = iota // 允许事件递归,可能会无限递归
	EventRecursion_Disallow                       // 不允许事件递归,递归时会panic
	EventRecursion_Discard                        // 丢弃递归的事件,不会再发送给任何订阅者
	EventRecursion_Truncate                       // 截断递归的事件,不会再发送给当前订阅者,但是会发送给其他订阅者
	EventRecursion_Deepest                        // 深度优先处理递归的事件,会中断当前事件发送过程,并在新的事件发送过程中,不会再次发送给这个订阅者
)

type Hook

type Hook struct {
	// contains filtered or unexported fields
}

Hook 事件钩子,主要用于重新绑定或解除绑定事件,由BindEvent()创建并返回,请勿自己创建

func Bind added in v0.2.58

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

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

func (*Hook) IsBound

func (hook *Hook) IsBound() bool

IsBound 是否已绑定事件

func (*Hook) Unbind

func (hook *Hook) Unbind()

Unbind 解绑定事件与订阅者

type IEvent

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

IEvent 事件接口

定义事件:

1.按以下格式编写一个接口,即完成事件的定义:
type Event{事件名} interface {
	On{事件名}({参数列表})
}

2.在定义事件的源码文件(.go)头部添加以下注释,在编译前自动化生成代码:
//go:generate go run git.golaxy.org/core/event/eventc event

定义事件的选项(添加到定义事件的注释里):

1.发送事件的代码的可见性
	+event-gen:export=[0,1]

2.是否生成简化绑定事件的代码
	+event-gen:auto=[0,1]

使用事件:

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{事件名}.Close()
}

订阅事件:

1.在组件的成员函数,编写以下代码:
func (c *Comp) On{事件名}({参数列表}) {
	...
}

2.在需要订阅事件时,编写以下代码:
func (c *Comp) MethodXXX() {
	{事件定义包名}.Bind{事件名}({发布者}, c)
}

3.如果订阅者生命周期小于发布者,那么需要记录hook并且在Dispose时解除绑定,示例如下:
type Comp struct {
	ec.ComponentBehavior
	hook event.Hook
}
func (c *Comp) MethodXXX() {
	c.hook = {事件定义包名}.Bind{事件名}({发布者}, c)
}
func (c *Comp) Dispose() {
	c.hook.Unbind()
}

4.如果不想写代码记录hook,可以使用ec.ComponentBehavior、ec.EntityBehavior或runtime.Context的ManagedHooks()来记录hook,在它们生命周期结束时,将会自动解除绑定

type IEventCtrl

type IEventCtrl interface {
	// Init 初始化事件
	Init(autoRecover bool, reportError chan error, recursion EventRecursion)
	// Open 打开事件
	Open()
	// Close 关闭事件
	Close()
	// Clean 清除全部订阅者
	Clean()
}

IEventCtrl 事件控制接口

type IEventTab

type IEventTab interface {
	IEventCtrl
	// Get 获取事件
	Get(id uint64) IEvent
}

IEventTab 事件表接口,方便管理多个事件

使用方式:

1.在定义事件的源码文件(.go)头部添加以下注释,在编译前自动化生成代码:
//go:generate go run git.golaxy.org/core/event/eventc eventtab --name={事件表名称}

定义事件的选项(添加到定义事件的注释里):

1.事件表初始化时,该事件使用的递归处理方式,不填表示使用事件表初始化参数值
	+event-tab-gen:recursion=[allow,disallow,discard,truncate,deepest]

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