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 ¶
From 取出 k 槽位的值:
- 未写入 → (T 零值, false);
- 写入了 nil(With(ctx, k, nil),接口 T)→ (零值, true)——写读对称 (#245),「存了 nil」≠「没存」;
- 绕过 With 直写 context.WithValue 的值(载体不是本包的 entry)→ (零值, false),与未写入同口径——存储值类型与声明不符只可能来自 这种绕过纪律的调用方。
func IsSet ¶ added in v0.37.7
IsSet 报告 k 槽位是否被 With 写过(含显式写入的 nil,#245)——只查 存在性,不解引用。绕过 With 直写 context.WithValue 的值按未写入处理 (与 From 同口径)。
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(命名空间为 "")技术上 可用但没有防撞意义,不鼓励。