Help us shape the future of Go! Take the 2026 Go Developer Survey

lifecycle

package
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Nov 3, 2026 License: Apache-2.0 Imports: 6 Imported by: 0

Documentation

Overview

Package lifecycle 提供实例式资源关闭栈,零第三方依赖且没有进程级全局状态。

Stack 零值总回收期限为 20 秒。使用 New(timeout) 可自定义整个栈的期限;0 沿用默认值,负值非法。调用方登记自己负责关闭的资源,Close 按登记的逆序执行; 即使某个关闭函数返回错误或 panic,仍在剩余期限内尝试其余函数。首次 Close 在 全部尝试后重新抛出第一个 panic;后续 Close 返回包含 panic 信息的汇总错误。 Close 不调用 panic 值的格式化方法;读取汇总错误文本时才生成 panic 信息。

典型用法(logger 和 client 已由调用方创建):

var stack lifecycle.Stack
if err := stack.Register(func() error { return logit.Close(logger) }); err != nil {
    return err
}
if err := stack.Register(client.Close); err != nil {
    return errors.Join(err, stack.Close())
}
// 服务排空结束或超时取消后:
return stack.Close()

日志关闭函数先登记,因此在其他资源关闭后才执行。共享资源只登记一次; 模块不需要依赖 lifecycle,也不应自行注册到全局关闭列表。 回调在独立 goroutine 执行,Close 在整体期限内逐个等待;超时返回 ErrCloseTimeout, 同时保留 context.DeadlineExceeded 和已完成错误,不再发起后续回收。迟到回调可能继续运行。 调用方须在回收超时后立即退出进程;库不调用 os.Exit。重复 Close 共用首次结果与期限。 自定义示例(需导入 time):

stack, err := lifecycle.New(15 * time.Second)
if err != nil {
	return err
}
return stack.Close()

Index

Constants

This section is empty.

Variables

View Source
var (
	// ErrClosed 表示关闭已开始,不能再登记关闭函数。
	ErrClosed = errors.New("lifecycle: stack closed")
	// ErrNilCloser 表示登记了 nil 关闭函数。
	ErrNilCloser = errors.New("lifecycle: nil close function")
	// ErrCloseTimeout 表示整个资源栈的回收期限耗尽;调用方应退出进程。
	ErrCloseTimeout = errors.New("lifecycle: close timeout")
)

Functions

This section is empty.

Types

type Stack

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

Stack 按登记逆序回收资源,全部回收共享期限;零值默认 20 秒,使用后不可复制。

func New

func New(closeTimeout time.Duration) (*Stack, error)

New 设置整个栈的回收期限;零值使用 20 秒,负值非法。期限创建后不可修改。

func (*Stack) Close

func (s *Stack) Close() (err error)

Close 逆序执行全部关闭函数并汇总错误;后续调用等待并返回已收集的错误。 关闭函数不得递归调用同一个 Stack 的 Close。 关闭函数 panic 时继续执行其余关闭函数,随后向首次调用者传播第一个 panic。 后续调用返回包含 panic 信息及关闭错误的汇总结果。 超时停止发起后续关闭;正在执行的回调可能继续运行,调用方须随后退出进程。

func (*Stack) Register

func (s *Stack) Register(closeFunc func() error) error

Register 登记一个关闭函数。nil 函数返回 ErrNilCloser;关闭开始后返回 ErrClosed。

Jump to

Keyboard shortcuts

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