ctxscope

package
v0.37.0 Latest Latest
Warning

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

Go to latest
Published: Nov 7, 2026 License: MIT Imports: 2 Imported by: 0

Documentation

Overview

Package ctxscope 提供类型安全的请求级作用域传递原语(#201):命名空间 key + 泛型 With/From——把「会话/角色/追踪 sink」沿 context.Context 下传 到工具/处理器,替代各消费方手写的 context.WithValue + 私有 key 类型 + FromContext 类型断言三件套。

为什么是库而不是各自手写:

  • key 碰撞防护:私有 `type ctxKey struct{}` 在同一进程内跨包仍可能撞 (两个包各定义一个空结构体 key 并往同一个 ctx 写,后者静默覆盖 前者)。Key 携带**字符串命名空间** + 泛型值类型——命名空间是防撞 的治理面(推荐逆域名风格 "git-ferry/authz.Role"),值类型是第二重 隔离(同命名空间不同 T 是不同的 key);
  • 泛型消样板:With/From 一行各一个,类型断言收进库;
  • 测试注入统一:测试里 ctxscope.With(ctx, roleKey, RoleAdmin) 构造 任意作用域 ctx,不必模拟整条中间件链。

与 contextx.ValueOnlyFrom 的关系:正交并存——ValueOnlyFrom 是「从已有 ctx 取值」的适配(剥离取消传播),本包是「类型安全地写入 + 命名空间 key」的原语。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func From

func From[T any](ctx context.Context, k Key[T]) (T, bool)

From 取出 k 槽位的值:不存在(或存储值类型与声明不符——只会发生在 绕过 With 直写 context.WithValue 的调用方身上)返回 T 的零值与 false。

func MustFrom

func MustFrom[T any](ctx context.Context, k Key[T]) T

MustFrom 取出 k 槽位的值;不存在时 panic。供**启动期断言**用(路由/ 中间件装配时确认必需的作用域已注入——fail-fast 到进程启动,而不是 等请求路径上拿到零值静默错行)。请求处理路径上请用 From 的 (T, bool) 双返回值形态。

func With

func With[T any](ctx context.Context, k Key[T], v T) context.Context

With 把 v 存入 ctx 的 k 槽位,返回派生 ctx。零值/缺省(From 查不到) 语义由调用方语义决定——本包不引入「零值即默认」的隐式行为。

与 context.WithValue 同底线:不要用本包传递可选的请求参数(那是函数 参数的事),它面向「跨多层框架代码下传的请求级作用域」(会话/角色/ 追踪 sink)。

Types

type Key

type Key[T any] struct {
	// contains filtered or unexported fields
}

Key 是带命名空间的作用域 key(#201):字符串命名空间防跨包碰撞, 泛型参数 T 钉住该 key 携带的值类型(同命名空间不同 T 是不同的 key—— 值类型是命名空间之外的第二重隔离)。

Key 是可比较的值类型(仅含一个 string),可作 map key、可拷贝、可作 结构体字段/包级变量。**应当包级声明一次、全进程复用**(命名空间推荐 逆域名风格 "git-ferry/authz.Role");零值 Key(命名空间为 "")技术上 可用但没有防撞意义,不鼓励。

func NewKey

func NewKey[T any](namespace string) Key[T]

NewKey 创建带命名空间的作用域 key。namespace 为调用方的治理标识 (推荐 "<组织/仓>/<类型>" 逆域名风格);空串可用但无防撞意义—— 两个包都用空命名空间 + 同一 T 时互相覆盖,与手写私有 key 的碰撞 风险等同。

func (Key[T]) Namespace

func (k Key[T]) Namespace() string

Namespace 返回 key 的命名空间(调试/诊断用)。

Jump to

Keyboard shortcuts

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