pkg

module
v0.37.3 Latest Latest
Warning

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

Go to latest
Published: Nov 7, 2026 License: MIT

README

pkg

微工具集 25 合 1(零第三方依赖,仅标准库)——bloomx/bufiox/cache/cli/container/contextx/convert/encoding/enumx/errors/httpjson/jsonrepair/mathx/pack/pagination/pathx/ptrx/secretx/shellx/singleflighttest/slicex/stringx/strmap/timex/urlguard

🌐 项目主页:https://oekit.github.io/ · 名称由来:Open Easy Kit(开源 · 易用 · 工具集合) 🤖 AI Agent:本仓规范与硬规则见 AGENTS.md;机器可读索引见 llms.txt(接口签名以源码为准)。

安装

go get github.com/oekit/pkg@v0.37.1

这个仓库做什么

pkg 是 oekit 的基础工具集:24 个经过生产验证的小工具包合成一个 module, 覆盖错误处理、字符串/切片/类型转换、泛型容器、时间与 cron、JSON 修复、 HTTP JSON 调用、分页、glob 匹配、进程内缓存、零拷贝缓冲 IO、GC 友好只读字典、 CLI 子命令分发、迁移包容器等日常高频需求。标识与校验(uidgen/validator)已拆分至 kitx。

设计原则:

  • 按包编译:import 哪个子包用哪个,go.mod 只多一条 require,二进制零冗余
  • 零第三方依赖(本仓硬规则,CI 强制):go.mod 永不出现 require——全部子包仅依赖标准库;需要三方能力的基础工具拆独立仓(先例:validator/uidgen → kitx)
  • 生产验证:全部代码源自 enjoydream 后端服务多年共用积累,带完整单元测试(24/24 包)

包清单

包 做什么
errors 错误链 Wrap/Cause(nil-safe)、BizError(业务码/HTTP 码双轨)、Chain/In 组合工具、sentinel 错误。整个矩阵的错误处理基座
bloomx 本地布隆过滤器:FNV-1a 双哈希、RWMutex 并发安全,缓存穿透防护/去重预检(非法入参归一默认值)
contextx ValueOnlyFrom 只传值轻量 ctx:剥离 Done/Err/Deadline,把请求值交给后台任务而不继承取消/超时
stringx ID 生成、关键词包含匹配、缩进、英文复数化、{key} 模板替换;trie 多模式替换器 Replacer(字面量、最长匹配)、NewMask 词表遮罩;Masker 正则脱敏(v0.16.0 起)——按形态分类打码(形态标签进掩码供审计读),保留首尾各 ≤4 字符作定位线索且不可复原(保留位封顶、不随长度变化),规则表由调用方完全提供、库不内置任何业务词表;CSV 拆分 SplitCSVNonEmpty(拆 + trim + 丢空项,空串返回 nil 而非空切片——SplitByComma 只是 strings.Split,SplitWith 按空白切会拆坏含空格的值);JSON 字段级脱敏 MaskJSONFields(顶层对象字段值替换为固定文案:字段缺省时补上、解析失败透传 json 包原始错误不包装、输出经 map 字典序重序列化——既有消费方把错误文本透传到响应,包装即改文案)
slicex Partition 二分组(保序)、GroupBy 等切片操作
container 泛型容器(v0.9.0 起,收编原 collectionx):Set(集合代数并/交/差)、Ring 定长环形缓冲、Queue 阻塞队列、SafeMap(RWMutex)、Map(sync.Map 背书,读多写少)、Slice 并发安全切片——参考 go-kratos/kit container 设计
enumx 枚举:确定性顺序的 All/Values/解析(map 遍历乱序问题的解法)
convert 字符串/数字/布尔/切片的宽容转换(脏输入友好)+ 可信代理客户端 IP 解析(v0.25.2 起,v0.26.0 收紧):ResolveClientIP(remote, xff, trustedProxies) 是框架无关的纯函数——XFF 从右向左跳过可信代理,伪造值不采信,直连不可信时忽略一切代理头;v0.26.0 起默认不采信 X-Real-IP(单跳头无法区分「代理写的」与「客户端自带的」,网关默认不写该头但透传客户端自带的 ⇒ 客户端可任意改写自己的客户端 IP,pkg#106),确需采信改用 ResolveClientIPWithXRI;代理头候选值做合法性校验与端口归一(非法段不进返回值——任意字符串进限流/锁定键等于绕过计数桶且可污染日志,pkg#104);裸 IP 形态的可信代理条目现在生效(此前被静默忽略:配置不生效且无告警);NewTrustedProxySet 构造期解析清单、请求期零 CIDR 解析(热路径,pkg#107);GetClientIP/GetClientIPWithProxies 是它的 net/http 适配层,Hertz 等非 net/http 框架复用同一份口径,不再各写一遍
encoding JSON 序列化助手(UnmarshalUseNumber 系列保留 json.Number,防 >2^53 float 精度丢失)+ FNV-1a/SHA-256 摘要与 Base64(带填充 / 无填充(Raw)× 标准 / URL 安全四种字母表变体齐备,JWT / OIDC / PKCE 协议段用无填充 base64url;RawURL 一族另有字节入口 Base64RawURLEncodeBytes/Base64RawURLDecodeBytes,pkg#105)
jsonrepair LLM 输出等脏 JSON 的宽容修复链(围栏/尾逗号/单引号/括号闭合),修复永不失败——异常时回退原文;UnmarshalLenient 宽松模式尽力闭合截断的数组/对象(半截字符串/键位补 null/悬空逗号)并回报 partial
httpjson 带 JSON 解析的 HTTP 调用助手 + NormalizeBaseURL(SDK base 配置规范化:补 scheme/去尾斜杠/去空白,v0.36.0 起)
mathx 安全随机、平均值等统计助手 + Unstable 抖动值(Around 对称打散缓存 TTL 防雪崩 / Upward 单边向上,重试退避「不得早于基准」)
pathx glob 路径匹配(vendor/**、*.test)+ 仓库相对路径清洗与 traversal 拒绝 SanitizeRel/SanitizeRelStrict(统一分隔符、消除 ./.. 段,绝对路径与越出根目录一律拒绝;/ 与 \ 同为分隔符,跨平台同判;严格档连显式 .. 段一并拒绝)+ 文件名消毒 SanitizeFileName(展示/存储用:目录成分丢弃只取最后一段、控制字符丢弃、Windows 保留字符 `: * ? " < >
shellx POSIX shell 参数转义原语(v0.27.0 起,#112):Quote(s) 把任意字符串转义成一个 shell word——POSIX 单引号包裹(单引号内 shell 不做任何解释,唯一要照顾的是引号本身:关掉、转义、重新打开);空串返回 ''(空参数仍是一个参数,丢掉会让 cmd '' arg 变成 cmd arg、参数整体错位);QuoteArgv(args...) 逐个转义后空格连接。纯转义、不做策略判断(换行/越界各有各的规则,由调用方决定)。与 pathx 是两个不同问题——pathx 问「路径合法吗」(越界即拒绝),shellx 问「怎么写进命令行才不被 shell 解释」,路径类输入通常两道都要过;不转义的实际后果见 issue #112
pagination PageRequest/PageResponse 分页换算 + 服务级口径 Policy(v0.25.2 起):默认页长/上限/超限语义由服务自己声明,零值口径等同包级默认;超限的两种语义都能表达——OverMaxClamp(钳到上限)与 OverMaxFallback(回退默认页长,响应条数不同,属可观测差异),MaxPageSize < 0 表示不限上限;Walk(v0.36.0 起)翻页聚合单源——固定 pageSize 短页即末页逐页拼接、逐页 ctx 取消检查、页错误带页码上下文不返回半截结果,MaxWalkPages 防呆把「上游恒返整页」契约违例从死循环变 ErrTooManyPages
ptrx 指针 To/From 与安全解引用
timex(+cron) 时间格式化/解析/时间戳 + cron 表达式(Next 保证严格晚于入参,含夏令时回拨/前跳日——见 doc.go)
cache 缓存接口 CacheAside + BatchGetter 批量能力(MGet)+ LocalCache/SingleFlightCache + 刷新检查器 Checker(TTL 后台刷新、失败按 failTTL 降级、并发请求合并为一次刷新);LocalCache 内置 null marker 防穿透、stale-if-error、单飞、批量 MGet、时钟注入(LocalConfig.Now);v0.16.0 起可选形状:NoBackgroundSweep 关闭后台清扫 goroutine(嵌入式/短命进程场景,公开 Sweep 手动清扫口)、CloneOnRead 读命中返回副本(调用方可改写返回值不污染缓存)、EvictPolicy 可选 LRU(默认 FIFO 写序淘汰不变)、GetEx 区分「未命中」与「命中但值为 nil」(既有 Get 签名不变,新增能力以可选接口 Sweeper/HitGetter 外置,不破坏其它后端实现);v0.23.0 起补 Peek 非删除式读(可选接口 PeekGetter 外置——读到过期条目只算不命中、不删除它,stale-if-error 兜底需要那份过期真值留在表内;SingleFlightCache 包装 LocalCache 时曾因前置检查走 Get 惰性删除而静默废掉 StaleIfError,#72);v0.24.0 起补观测计数面 Stats(可选接口 StatsProvider 外置——命中/未命中/容量淘汰/TTL 过期回收计数,要暴露缓存指标的仓不必自写一份带计数的 TTL 缓存,#76)+ 按调用注入回源(可选接口 SourceInjector 外置——GetOrLoadWithSource/GetOrLoadWithSourceTTL,回源依赖 key/调用上下文的 token·凭据类缓存不必在缓存外再包一层 key→source 注册表,单飞语义不变,#77);v0.25.0 起修正 SingleFlightCache 包装 LocalCache 时的观测计数口径——一次未命中曾被前置检查(Peek)与回源加载路径各计一次(命中率指标失真:真实 90% 被报成 81.8%),修正后一次读恰好计入命中或未命中之一,与内层直连口径一致(#90)
bufiox 面向协议编解码的零拷贝缓冲 IO:读侧 Next/Peek 返回缓冲视图,写侧 Malloc/WriteBinary 攒批一次 Flush(bytes 与 io.Reader/Writer 双实现)
strmap GC 友好的只读字符串 map:键打包 + int32 哈希表 + maphash,海量静态映射(header/字典表)零 GC 扫描开销
singleflighttest singleflight 共享契约测试套件(internal 与 concurrency 双侧引用):同一份断言跑不同 singleflight 实现,行为漂移即红
cli 框架无关、可单测的子命令分发原语(v0.16.0 起)——App/Command + 退出码约定写死在包里(0 成功 / 1 运行失败 / 2 用法错误,未知子命令与参数不合法均归 2),usage 由 Command.Summary 自动生成;Run 不读 os.Args、不调 os.Exit,参数与 stdout/stderr 全由调用方给(因此命令逻辑可被单元测试直接调用,不必起子进程);配套 NewFlagSet 把 flag 的错误输出重定向到调用方给的 stderr;v0.31.0 起补三件不必各写一遍的事——内建帮助(--help/-h/help 打印用法到 stdout、退出码 0,问帮助不是错误)、内建版本(App.Version 非空时 --version)、默认子命令(App.Default 非空时无参即执行它),另加子命令别名(Command.Aliases,名字优先于别名)与两个渲染原语 Table(列宽自适应,中文按两列算宽)与 Report(doctor 式自检清单)
pack 迁移包容器原语(v0.16.0 起)——zip 容器 + manifest 清单(格式版本 / 来源 / 各类条数 / 每文件 SHA-256)+ JSONL 流式读写(逐行编码,不整包进内存)+ Inspect 体检:一次列全问题(缺文件、摘要不符、条数不符、多余文件、非法文件名)而不是遇到第一个就停,且用哨兵错误区分「包损坏」与「版本不认识」两类不可导原因;文件名净化防 zip 路径穿越
secretx 静态敏感凭证的信封加密原语(v0.34.0 起)——ParseKey(base64 + 16/24/32B 校验,错误带实际长度上下文)+ NewBox 构造期 fail-fast(缺钥 ErrNoKey,不提供缺钥明文透传降级)+ Box.Seal/Open("v1:"+base64(nonce‖ct),AES-GCM 必带认证、crypto/rand 随机 nonce、与 domain-manage 手搓形态逐字节兼容——存量数据零迁移)+ SealWithAAD/OpenWithAAD 绑定行 id/用途防密文挪用 + ErrUnsupportedVersion 版本前缀识别位(主密钥轮换缝线)+ ErrBadCiphertext 统一表述(密钥不匹配与密文损坏不可区分,不向日志泄露配钥关系)(#177)+ 内存态持有原语 SecureString/SecureBytes(v0.36.0 起,收编 zentao-mini/max 同源实现)——XOR 混淆存储防内存明文扫描 + Set/Clear 双向零化 + Get 副本隔离 + EqualConstantTime(crypto/subtle);设计立场:内存扫描缓解而非加密,静态落库走 Box
urlguard 出站 URL 的 SSRF 防护原语:层 1 CheckURL 字面量校验(私网/loopback/链路本地含云元数据 169.254.169.254/CGNAT/ULA、.internal/.local/localhost 域名、scheme 白名单、IPv6 特殊用途段与 NAT64 段——64:ff9b::/96(64:ff9b::7f00:1 即 127.0.0.1 的 IPv6 写法)等可指向回环/内网、exotic IPv4 字面量形态 0x7f000001/127.1/2130706433 一律拒——标准库解析器不认、宽松解析器当地址);层 2 DialFunc 拨号包装——解析出的每个 IP 预检 + 实际 RemoteAddr 端点核对(闭合重解析 TOCTOU 窗口,覆盖 Happy-Eyeballs);IPv4-mapped IPv6 归一;构造态豁免 WithAllowPrivate/WithAllowCIDRs/WithAllowDomains;精确 host 白名单 WithExactHosts(host[:port] 必须完全相等——后缀豁免只能"放宽某域及其子域",钉死到具体 host 需要这一档;与豁免维度独立,命中后仍走 scheme 与私网判定);自定义判定钩子 WithCheckIPFunc/WithCheckHostFunc(放行型模型表达不了限制型策略——IP 白/黑名单、域名白/黑名单;注入后消费方的策略成为单一判定源,且同时作用于「预检」与「建连后端点复核」两处,重解析窗口由消费方自己的策略闭合,不必在 urlguard 之外再叠一层自有端点判定;判定顺序内置在前、自定义在后,构造态豁免只豁免内置判定、不再跳过自定义判定,#91);与 httpx WithDialFunc 一行组合

快速使用

import (
    "github.com/oekit/pkg/errors"
    "github.com/oekit/pkg/jsonrepair"
    "github.com/oekit/pkg/stringx"
)

// 错误链:nil-safe 包装 + kv 关联字段,Is/As 语义保持
err := errors.Wrap(io.ErrUnexpectedEOF, "read config", "path", "/etc/app.yaml")

// 脏 JSON 修复(LLM 场景)
fixed := jsonrepair.Repair(`{"name": "oekit",) `)

fmt.Println(stringx.Pluralize(3, "module")) // 3 modules
import (
    "github.com/oekit/pkg/bufiox"
    "github.com/oekit/pkg/strmap"
)

// 零拷贝解析:Peek 定长头 → Next 出负载视图,全程无字段级拷贝
r := bufiox.NewDefaultReader(conn)
hdr, _ := r.Peek(4)                  // 零拷贝视图
_ = r.Skip(4)
payload, _ := r.Next(int(binary.BigEndian.Uint32(hdr)))
defer r.Release(nil)                 // Release 后视图失效

// GC 友好只读字典:构建后只读,Get 无 map 开销
var canon = strmap.NewStr2StrFromMap(map[string]string{
    "content-type": "Content-Type",
})
name, ok := canon.Get("content-type") // "Content-Type", true

边界

  • 需要并发原语(safe-go/重试/限流)→ concurrency
  • 需要日志 → logx;需要数据库 → gormx
  • 本仓不依赖矩阵内任何其他模块(validator→errors、httpjson→stringx、bloomx→encoding 三条内部边除外)

矩阵总览(24 活跃模块,自动生成)

模块 内容 矩阵内依赖
pkg 微工具集 24 合 1(errors/bloomx/contextx/container/stringx/slicex/enumx/convert/encoding/jsonrepair/httpjson/mathx/pathx/pagination/ptrx/shellx/timex/cache/bufiox/strmap/singleflighttest/urlguard/cli/pack;v0.10.0 起 uidgen/validator 拆至 kitx);errors(v0.12.0 起)New/As/Is/Unwrap 与 stdlib 同型透传——下游哨兵/As 判定单 import 即可,类型同一性红线可完整执行;cache(v0.4.0 起)含缓存接口 CacheAside + BatchGetter 批量能力(MGet)+ LocalCache/SingleFlightCache + cachetest 契约(Run 真实时间 + RunWithClock 假时钟确定性 TTL 边界)+ Checker;LocalCache 时钟可注入(LocalConfig.Now——TTL/NullTTL 全路径确定性测试,v0.13.0 起);v0.16.0 起 LocalCache 可选形状——NoBackgroundSweep 关闭后台清扫 goroutine(嵌入式/短命进程,公开 Sweep 手动清扫口)、CloneOnRead 读命中返回副本(调用方可改写不污染缓存)、EvictPolicy 可选 LRU(默认 FIFO 不变)、GetEx 区分未命中与值为 nil(新增能力以可选接口 Sweeper/HitGetter 外置,不破坏其它后端);v0.23.0 起补 Peek 非删除式读(可选接口 PeekGetter 外置——读到过期条目只算不命中、不删除它,stale-if-error 兜底需要那份过期真值留在表内;SingleFlightCache 包装 LocalCache 时曾因前置检查走 Get 惰性删除而静默废掉 StaleIfError,#72);container(v0.9.0 起,收编原 collectionx)泛型容器 Set/Ring/Queue/SafeMap + Map(sync.Map 背书)/Slice(并发安全);mathx/jsonrepair(v0.11.0)Unstable 单边向上抖动 Upward / 宽松解析 UnmarshalLenient / 抽对象与抽数组对称原语 ExtractObject·ExtractArray(v0.18.0 起——多段数组与散文含 '{' 的数组文本不再整段作废,取首个口径与对象面一致);timex/stringx(v0.7.0 起)时间段边界 BeginningOf/EndOf 七对(分/时/日/周/月/季/年,周起始显式参数)+ trie 多模式替换器 Replacer(最长匹配)/ NewMask 敏感词遮罩;stringx Masker(v0.16.0 起)正则脱敏——按形态分类打码(形态标签进掩码供审计读)+ 保留首尾各 ≤4 字符定位线索且不可复原(保留位封顶不随长度变化),规则表由调用方完全提供;singleflighttest(v0.8.0 起)singleflight 共享契约测试套件(internal 与 concurrency 双侧引用);urlguard(v0.15.0 起)出站 SSRF 防护原语——CheckURL 字面量校验(私网/loopback/链路本地含云元数据 169.254.169.254/CGNAT/ULA/组播保留、.internal·.local·localhost 域名、scheme 白名单、IPv4-mapped IPv6 归一)+ DialFunc 拨号层预解析校验与实际 RemoteAddr 端点核对闭合 TOCTOU(Happy-Eyeballs 覆盖),构造态豁免 WithAllowPrivate/WithAllowCIDRs/WithAllowDomains,与 httpx WithDialFunc 一行组合(httpx#11);cli(v0.16.0 起)框架无关可单测的子命令分发原语——App/Command + 退出码 0/1/2 写死在包里、usage 按 Summary 自动生成、不读 os.Args 不调 os.Exit(输出流全由调用方给);pack(v0.16.0 起)迁移包容器原语——zip + manifest(格式版本/条数/每文件 SHA-256)+ JSONL 流式读写 + Inspect 体检一次列全问题并区分包损坏与版本不认识 —
concurrency 并发与流控原语(async/gopool/group/singleflight/progress/syncx/ratelimit/retry)+ window 滑动窗口 / breaker 自适应熔断(规范哨兵 ErrCircuitOpen)/ shedding CPU 自适应降载 / batch 攒批执行器(满条数/满字节/窗口去重)/ timewheel 单级时间轮;v0.5.0 起 retry 指数退避+抖动(MaxDelay 封顶/溢出饱和)、loop 周期原语(忙时丢 tick/单轮 panic 收编/FirstDelay 可打断)、async labeled RunSafe(panic 按任务标签上报)、syncx.FanInErr 逐槽错误(panic 槽显式标记)、KeyedLimiter 增强(容量护栏/RetryAfter/速率热更)并接入 pkg/singleflighttest 契约测试;v0.8.0 起 singleflight DoShared 折叠可观测(Result.Waiters)、async panic 统一收编 typed *PanicError(errors.As 可辨、携带栈)+ 实例级 Runner panic 路由、retry DelayHint(服务端 Retry-After 建议优先)+ JitterRatio 比例抖动 + retry/httpx Retryable 可重试性判定;v0.9.0 起 breaker 显式三态状态机 closed/open/half-open——冷却(WithProbeTimeout 缺省 1m)期满首个放行即半开探测、探测成功关闸清窗/失败重开、失联超时自动回收 + AbandonGen 显式放弃,GenBreaker 代绑定(AllowGen/SuccessGen/FailureGen/AbandonGen:代仅在探测放行自增、陈旧代回报整体作废、开放期失败不后移冷却);v0.10.0 起 WithCooldown 独立业务冷却期(缺省回落 probeTimeout)+ WithConsecutiveFailures 连续失败计数触发(与速率型并联,补低 QPS 信号,对齐 Envoy consecutive_5xx);v0.11.0 起 ratelimit Lockout 防爆破锁(fail2ban 形态:滑窗失败计数→阈值锁定拒绝 LockDuration→成功 Reset 清零/到期自解,CheckLocked 返回剩余时长);v0.12.0 起 retry/httpx RetryableWithHeaders(403 + Retry-After/X-RateLimit-Remaining 头感知可重试判定,HeaderSource 零依赖抽象)、syncx FanInLimit 受限并发扇出(固定 worker 防下游过载)+ FanInLimitCtx(v0.14.0,ctx 感知:ctx 已取消未启动项 fn 一次不调、剩余槽快速排空 Canceled、在飞项照常落槽)、ratelimit WithTokenClock 时钟注入;v0.13.0 起 breaker 熔断期收敛到探测级(forcePass 强制探活 + 冷却期满半开探测,其余拒绝——SRE 公式退役为 closed→open 触发器,WithConsecutiveFailures 触发后流量真停)+ State()/State 枚举可观测出口;v0.16.0 起 ratelimit NewKeyedLimiterByFunc[K]——factory func(K) Limiter 按 key 定配额(一个管理器按接口维度分档位,NewKeyedLimiterOf 零破坏随迁;未登记 key 拿 factory 兜底档的坑已在 doc 点名,#31);v0.17.0 起 KeyedLimiter.Create 护栏内原子登记(表满先回收空闲与 Allow 同路、仍满拒绝计 OverCapHits、已存在不覆盖——热更走 Replace;解决 ByFunc factory 库锁内调用致消费方锁序倒置,#33);v0.18.0 起 retry.DoValue 泛型伴生——带返回值的重试(DoValue[T](ctx, cfg, fn func(attempt int) (T, error));Do 改为委托给 DoValue——退避序列/抖动/MaxDelay 封顶/DelayHint 优先/Retryable 门控/ctx 取消只有一份实现,杜绝「同一个仓里两份实现」;失败返回零值与最后一次错误) pkg
logx 统一日志门面(多后端可替换 + caller 归属;Sink 已迁嵌套模块 logx/sink,根包纯 stdlib);WithFilter 脱敏/丢弃包装(FilterKey 命中键替换 ***/FilterFunc 丢整条,子 logger 保持规则)、Slogger/SlogHandler 正向桥(三方 slog 直接消费 logx 生态)、TraceHandler 任意 slog.Handler 自动注入 trace_id、NewAuditLogger 审计留痕(级别锁 Info,不受 LOG_LEVEL 降级)、LevelEnabler 热路径提前判级、ParseLogLevel 返回 (Level, error) + ParseLogLevelOr 配错退默认(v0.7.0);优雅关停正身在 core/lifecycle.Manager(logx/shutdown 仅余 Deprecated 别名);桥接子包 hlog/hertzlog/kitexlog 为嵌套模块按需引入 core
core 应用基建件——governance 治理 schema、config 配置加载(LoadBootstrap/LoadDotEnv/Get* 系、default/env/range/options tag 校验、OverlaySource 多源叠加热更、ApplyEnvOverlay env 优先 12-factor 形态)、transport 协议无关传输上下文(Transporter/Header/Server·Client ctx 存取,仅标准库)、chain 中间件链(Handler/Middleware/Chain/Recovery/Timeout,与 nns-endpoint.Endpoint 同形)、lifecycle 契约 + Manager 优雅关停(自 logx/shutdown 迁入,日志 *slog.Logger——core 不再依赖 logx)、network IP 工具、version;v0.9.0 起 config FieldSet 显式提供集合(yaml 显式 port:0 不再被 default/env 覆盖——LoadBootstrap 默认接线,免全量指针化)+ require tag(必须 yaml/env 提供,缺失列全并附 env 提示)+ v0.9.1 修 yaml:,inline 字段在 FieldSet 下漏标记(inline 叶子显式零值曾被 default 覆盖);v0.9.2 env 卫生改纯静态(仅格式/重名,移除依赖进程环境的拼写冒烟检查——误报 PATH/HOME、漏无人设置的真拼错,core#8),命名一致性走 LintEnvNaming 诊断 / WithEnvNamingLint 可选 fail-closed / ignorederived="true" 豁免;v0.10.0 起 config 严格模式——LoadBootstrap[T](envFlag string, opts ...LoadOption) 传 config.WithStrict() 开启:未知键拒载(不再静默忽略),错误带嵌套路径 + 该层合法键清单 + 近似拼写建议(UnknownKeyError);默认行为不变,严格模式显式开启;v0.11.0 起 config 加载入口按来源拆开——LoadFile(任意路径:CLI -config 路径、容器内固定挂载位)+ Unmarshal(字节源:API 下发 / 模板渲染 / 测试夹具),与 LoadBootstrap(etc/ 约定)共享同一条解码线,因此严格模式诊断面(嵌套路径 / 合法键清单 / 拼写建议)与来源无关;LoadBootstrap 行为与错误文案逐字不变 —
kitx 标识与校验——uidgen(Snowflake 全局单例+Extract 元数据、手写 RFC 4122 v4 UUID 零第三方依赖、RandomHex/RandomString 拒绝采样随机串)+ validator(go-playground/validator v10 接口化门面:struct tag 校验/自定义规则注册/ValidationError Unwrap 为 BizError 400 对接 middleware.Fail)+ hash(v0.2.0 起非密码学哈希助手 Md5Hex/Md5Bytes——缓存键/幂等键/短唯一 code,格式稳定承诺,pkg 2026-09-15 治理移除弱哈希后 kitx 侧收编 pkg#10),自 pkg v0.10.0 拆出 pkg
metrics Prometheus 门面 + 弹性指标族 core
tracing OpenTelemetry 追踪 + trace_id 真相源(v0.3.0 起 OTLP 双协议导出:gRPC 缺省 / HTTP,Config.Protocol + Headers,切换协议不丢传播器/指标/旧 provider 关闭) logx
registry 注册发现核心(provider 无关 SPI:Registrar/Discoverer/Subscriber/ConfigStore + 实例模型 + netutil)+ sdbridge + registrymocks——根仓零第三方依赖;Nacos 实现与 Nacos 配置源已拆成嵌套模块(v0.5.0 起:registry/nacosimpl、registry/nacos——nacos-sdk-go 重依赖隔离在此,实测单独引入即拖 63 个第三方模块,不隔离时只要 SPI 接口的消费方也会被连带拖入) core
data 数据访问门面——复刻 ekit data/ 能力面:cache/rediscache/crud/distlock/gormx/redisx/timertask/cachetest 八子包 re-export(类型同一,实现住 pkg 与各子仓)+ cached 缓存读写编排(写后失效/事务提交后失效/查询缓存版本号失效/GetByIDs 批量点读 MGet 快路径/bloom 防穿透)+ twolevel 两级缓存与跨实例失效广播(v0.7.0 起本仓唯二非 re-export 实现);v0.15.0 起壳跟随源仓演进——cache 壳补 LocalCache 可选形状(EvictPolicy/Sweeper/HitGetter)、cachetest 壳补 5 个契约套件入口(套件 8 → 13 场景)、v0.18.0 起 cache 壳补 PeekGetter 别名 + cachetest 壳补 2 个 stale-if-error 契约入口(套件 13 → 15 场景)、timertask 壳的 Redis 形态随源仓 v0.2.0 迁至嵌套模块 timertask/redis(壳不再转发 RedisBackend/ShardManager,Redis 形态直接依赖该嵌套模块);all/ 聚合模块已废弃 retract concurrency、gormx、logx、pkg、redisx、timertask
gormx SQL/GORM 全家——连接池增强、框架无关 CRUD Service、仓储(原 oekit/gorm,v0.3.0 更名) logx、pkg
redisx Redis 全家——客户端封装(根包)、分布式缓存 cache/、分布式锁 distlock(Locker 同形可互换;Renew 手动续期(false=锁丢失,不进 Locker 接口保 etcdx 互换)+ WithAutoRenew 覆盖 TryLock 自动续期(v0.8.0 feat!:此前组合不续期);Semaphore ZSET 槽位信号量(v0.8.0:Acquire 同 identifier 幂等刷新 + Lua 内原子清过期槽崩溃自愈、Renew 仅未过期槽可续、Cleanup 返条数、无 Redis 降级 fail-fast))、分布式限流 ratelimit(Lua 三态 + 故障本地兜底);v0.9.0 起 distlock Lockout 分布式防爆破锁(Redis 侧 fail2ban:滑窗失败计数→阈值锁定 Penalty→Reset 清零,与 concurrency/ratelimit.Lockout 进程内孪生——多实例共享计数是存在理由;惩罚只按首次触发计算、nil client fail-fast 不降级,#6) concurrency、logx、pkg
etcdx etcd 全家——客户端封装(根包:生产默认值/Health 探活/Close(ctx) 幂等)、registry 注册发现实现(SPI 对接 registry/nacos 链路:Lease KeepAlive 注册 + 丢约指数退避自动重注册、prefix Watch 订阅推送、ConfigStore KV 配置监听)、distlock 分布式锁(Session+concurrency.Mutex 公平排队,接口与 redisx/distlock.Locker 同形可互换,可选无 etcd 降级放行) concurrency、logx、registry
httpx HTTP 客户端 + 负载均衡——服务发现/熔断(规范哨兵 ErrCircuitOpen)/重试/指标/OTel 透传;loadbalance Selector 形态(RoundRobin/Random/Weighted/一致性哈希权重感知虚拟副本/p2c 自适应——EWMA 经 DoneFunc 回写建立、Err 计 1s 惩罚;WithFilter 按元数据过滤;v0.4.0 起 Balancer 全家族删除无兼容路径);codec 注册制编解码器(json 内置 + form 表单,DoCodec 请求按 codec 序列化、响应按 Content-Type 反查回退请求 codec);v0.6.0 起 net/http 桥接层 NewRoundTripper/StdClient——存量标准库外呼一行 Transport 接入熔断/重试/指标/链路(重试缺省关显式开、非 2xx 非错误、hop-by-hop 隔离,#8);v0.8.0 起 SafeDialFunc/WithSafeDial 出站 SSRF 防护胶水(判定单源 pkg/urlguard v0.15.0:解析 IP 全量预检 + 实际 RemoteAddr 端点核对闭合重解析 TOCTOU、Happy-Eyeballs 覆盖,构造态豁免;v0.7.0 内置的独立 httpx/urlguard 实现收敛删除,#11) concurrency、logx、metrics、pkg、registry、tracing
network 轻量网络客户端——WebSocket/NATS/MQ 抽象、连接与流工具 concurrency、logx、tracing
timertask 分片定时任务(FNV-1a、心跳续约);v0.1.5 起可选可靠投递 DeliveryAtLeastOnce(租约 + Ack + 可见性超时;过期租约回扫重投/死信、停机 best-effort 收租,v0.1.7 接入生命周期真正生效);v0.2.0 起 Redis 后端迁至嵌套模块 timertask/redis(根包不再引 go-redis/logx/concurrency,require 仅 pkg——import timertask 与 import timertask/local 的模块依赖面均无 redis,纯 stdlib 嵌入式场景可用)+ 新增 local 子包 cron 调度器 Scheduler(表达式复用 pkg/timex/cron 不另写一份;并发度/CatchUp 补跑/退出语义明确,FakeClock 假时钟驱动、触发点序列可确定性断言) pkg
middleware Hertz 标准中间件栈(模块根 mw,双层目录已收平)+ contrib 桥接 + hmw + SheddingMiddleware 自适应降载 + chainmw 子包(transport 感知框架无关中间件,基于 core/chain+transport:Recovery 带 panic 隔离上报钩子 WithRecoveryReporter、AccessLog skip+redact+自定义字段、MetadataPropagate——kitex 经 kitex/chainmw.ToKitex 复用同一实现,根包 Recovery/AccessLog 已薄壳化复用 chainmw 内核、下游 handler 可经 transport.FromServerContext 读协议无关传输信息);v0.6.0 起 accesslog 凭证路径脱敏(WithAccessLogRedactPathPrefixes)、ratelimit 默认 KeyFunc 去端口(连接桶→地址桶);v0.11.0 起 WithAccessLogSink 落库 sink(AccessRecord{Method,Path,Status,Latency,ClientIP,UserAgent,TraceID} 与日志同源、c 同传可读业务键、error/panic 只记 Warn 不影响主链路、SkipPaths 命中不触发)+ chainmw.WithSink 内核同构(kitex 随 ToKitex 获得)+ StackConfig.DisableResponseWrap 响应自管一键形态(TraceID→Recovery→AccessLog)与 AccessLogOptions 透传 + doc/README「适用边界」段(响应契约统一 vs handler 自管的推荐组合,#18);v0.12.0 起 AccessLog panic 恢复点产出记录(AccessRecord.Panic 标记 + Err 摘要,Hertz status 按 Recovery 缺省 500)后按原值重抛——panic 请求不再零访问记录,sink/kitex 桥接同步留痕,#20;v0.13.0 起 accesslog 内建日志可关闭/改道(WithAccessLogSilent 只采不写、WithAccessLogLogger 注入宿主 logger 避免双写;静默下 skip/redact/sink/panic 记录照常),内核 chainmw.WithSilent 同构(kitex 随 ToKitex 获得),#38 concurrency、core、logx、metrics、pkg、registry、tracing
k8s Kubernetes 客户端封装——RESTConfig/Clientset/DynamicClient 构建(显式 kubeconfig → in-cluster 自动 → KUBECONFIG/~/.kube/config 逐级回退,QPS/Burst 限流默认 50/100)+ leaderelection 子包 Lease 选主简化封装(OnStartedLeading/OnStoppedLeading/OnNewLeader 回调,主备单活,仅要求 Lease CRUD 权限) logx
nns NNS 服务治理客户端——provider 无关发现/配置/实例缓存 concurrency、core、logx、registry
nns-endpoint NNS 端点工厂——per-service 熔断、换实例重试、gRPC 池 httpx、logx、metrics、nns、registry
bootstrap 应用生命周期引导——New(WithServiceName/WithShutdownTimeout/WithBeforeServe) + Run(fn) + healthz;App.Ready/ReadyChan/IsReady 就绪门(幂等并发安全)——嵌套 bootstrap/nacos 自 v0.3.0 起 NNS 注册延迟到 Ready 之后(server 就绪 → userFn 触发 Ready → 才进注册中心)、关停序 nns 反注册先于 server 关闭;就绪门漏接时可观测——nacos 看门狗超时打 ERROR 点明「服务不会注册到注册中心」(WithReadyTimeout 可调)+ NNSComponent.RegistrationState() 暴露注册阶段(pending/registered/failed/skipped/shutdown);Metrics/Tracing 在嵌套模块 bootstrap/obs concurrency、core、logx
hertz Hertz 运行时集成(模块根扁平化)——日志桥接、生命周期、SSE/health/metrics、适配器、OTel、crudh/validatorh(基于 kitx/validator)/versionh(原 handler 微库收编);RunServer 变参就绪门 WithOnReady(全部 HostPort TCP 探活可建连后回调,探活超时按启动失败优雅关机;缺省超时 5s 经 WithReadyProbeTimeout 调整——探活目标是 server 自动取到的全部 HostPort,无探活地址覆盖选项(kitex 侧才有 WithReadyAddr)),配合 bootstrap Ready 实现 NNS 延迟注册;transportx(hertz→core/transport 同构适配器)+ chainmw 桥接 bootstrap、concurrency、core、gormx、kitx、logx、metrics、middleware、nns、pkg、registry、tracing
kitex Kitex 生态——日志桥接、治理热更、生命周期、BizError 桥接、kitexotel、istio(xDS 动态熔断,原 istio 微库收编);RunServer 变参就绪门(WithOnReady/WithReadyAddr/WithReadyProbeTimeout)+ chainmw.ToKitex(core/chain.Middleware → kitex 中间件,与 hertz 共享 middleware/chainmw 实现)+ transportx bootstrap、concurrency、core、logx、metrics、nns、pkg、registry
workflow 组合式流程编排——串行/并行/异步/条件分支 + Hook AOP concurrency、logx
kitex-examples Kitex echo 示例——client/server + IDL + 治理配置 bootstrap、core、kitex、logx、tracing

依赖严格自底向上;微库已合并为 pkg,旧微库仓已删除。

本仓在矩阵中的位置与依赖见上表「矩阵内依赖」列。历史沿革:源自 ekit 单体库 (git.enjoye.top/enjoydream/ekit v0.34.0,冻结维护),2026-10 拆分为独立 module。

License

MIT — 见 LICENSE

Directories

Path Synopsis
Package bloomx 提供进程内布隆过滤器。
Package bloomx 提供进程内布隆过滤器。
Package bufiox 面向协议编解码的缓冲 IO:读侧 Next/Peek/Skip 返回内部缓冲的 零拷贝视图(省去逐字段拷贝),写侧 Malloc/WriteBinary 攒批后一次 Flush (零拷贝引用调用方切片)。
Package bufiox 面向协议编解码的缓冲 IO:读侧 Next/Peek/Skip 返回内部缓冲的 零拷贝视图(省去逐字段拷贝),写侧 Malloc/WriteBinary 攒批后一次 Flush (零拷贝引用调用方切片)。
Package cache 进程内检查缓存原语(stdlib-only):TTL 缓存 + 刷新进行中 并发合并(inflight singleflight)+ 失败短 TTL。
Package cache 进程内检查缓存原语(stdlib-only):TTL 缓存 + 刷新进行中 并发合并(inflight singleflight)+ 失败短 TTL。
Package cli 提供框架无关、可单测的 CLI 子命令分发原语。
Package cli 提供框架无关、可单测的 CLI 子命令分发原语。
Package container 提供泛型容器微件:并发安全 Map(sync.Map 背书)、 SafeMap(RWMutex)、并发安全 Slice、Set、环形缓冲 Ring、阻塞队列 Queue。
Package container 提供泛型容器微件:并发安全 Map(sync.Map 背书)、 SafeMap(RWMutex)、并发安全 Slice、Set、环形缓冲 Ring、阻塞队列 Queue。
Package contextx 提供上下文(context.Context)变体工具。
Package contextx 提供上下文(context.Context)变体工具。
Package convert 提供常用类型转换工具函数。
Package convert 提供常用类型转换工具函数。
Package ctxscope 提供类型安全的请求级作用域传递原语(#201):命名空间 key + 泛型 With/From——把「会话/角色/追踪 sink」沿 context.Context 下传 到工具/处理器,替代各消费方手写的 context.WithValue + 私有 key 类型 + FromContext 类型断言三件套。
Package ctxscope 提供类型安全的请求级作用域传递原语(#201):命名空间 key + 泛型 With/From——把「会话/角色/追踪 sink」沿 context.Context 下传 到工具/处理器,替代各消费方手写的 context.WithValue + 私有 key 类型 + FromContext 类型断言三件套。
Package encoding 提供常用的编码和哈希工具函数。
Package encoding 提供常用的编码和哈希工具函数。
Package enumx 提供枚举管理能力。
Package enumx 提供枚举管理能力。
Package errors 提供线程安全的多错误聚合。
Package errors 提供线程安全的多错误聚合。
Package httpjson stdlib-only 的 HTTP+JSON 调用纪律单源:ctx 感知构造请求 → 执行 → 限容读体(读错误不吞)→ 状态码检查(错误体 rune 安全截断,不腰斩 UTF-8)→ JSON 解码(out 非 nil 时;out==nil 跳过解码,只判状态码),外加 可选的指数退避重试与服务端 Retry-After 建议捕获。
Package httpjson stdlib-only 的 HTTP+JSON 调用纪律单源:ctx 感知构造请求 → 执行 → 限容读体(读错误不吞)→ 状态码检查(错误体 rune 安全截断,不腰斩 UTF-8)→ JSON 解码(out 非 nil 时;out==nil 跳过解码,只判状态码),外加 可选的指数退避重试与服务端 Retry-After 建议捕获。
internal
singleflight
Package singleflight 提供并发请求合并(防击穿)工具。
Package singleflight 提供并发请求合并(防击穿)工具。
Package jsonrepair LLM 输出宽容 JSON 修复骨架:栅栏剥离 → 散文抽对象/抽数组 → 语法级修复 → 标量归一。
Package jsonrepair LLM 输出宽容 JSON 修复骨架:栅栏剥离 → 散文抽对象/抽数组 → 语法级修复 → 标量归一。
Package mathx 提供常用的数学工具函数。
Package mathx 提供常用的数学工具函数。
Package pack 提供跨宿主迁移用的资产包容器:zip 容器 + 一份清单(manifest)。
Package pack 提供跨宿主迁移用的资产包容器:zip 容器 + 一份清单(manifest)。
Package pagination 提供框架无关的分页参数定义。
Package pagination 提供框架无关的分页参数定义。
Package pathx 提供文件路径匹配与清洗工具。
Package pathx 提供文件路径匹配与清洗工具。
Package ptrx 提供指针相关的泛型工具函数。
Package ptrx 提供指针相关的泛型工具函数。
Package secretx 提供静态敏感凭证的信封加密原语(AES-GCM + 密文版本前缀 + 主密钥解析):把一段敏感字符串(云账号 SecretKey、LDAP bind 密码、渠道 token、git provider token 等)用主密钥封起来存库——此前每个服务各自手搓 AES,密钥/算法语义漂移出四个形态(CFB 无认证、缺钥明文透传、密文无版本位), 本包把它们收成一份正确默认(#177)。
Package secretx 提供静态敏感凭证的信封加密原语(AES-GCM + 密文版本前缀 + 主密钥解析):把一段敏感字符串(云账号 SecretKey、LDAP bind 密码、渠道 token、git provider token 等)用主密钥封起来存库——此前每个服务各自手搓 AES,密钥/算法语义漂移出四个形态(CFB 无认证、缺钥明文透传、密文无版本位), 本包把它们收成一份正确默认(#177)。
Package shellx 提供 POSIX shell 的参数转义原语。
Package shellx 提供 POSIX shell 的参数转义原语。
Package singleflighttest 是 singleflight 语义的共享契约测试套件。
Package singleflighttest 是 singleflight 语义的共享契约测试套件。
Package slicex 提供泛型 Slice 工具函数。
Package slicex 提供泛型 Slice 工具函数。
Package stringx 提供常用的字符串操作工具函数。
Package stringx 提供常用的字符串操作工具函数。
Package strmap GC 友好的只读字符串 map:键打包进单一 []byte、int32 开放寻址 哈希表,配合 maphash 种子哈希,避免为海量静态映射(如 header/路由/字典表) 长期持有海量小字符串对象带来的 GC 扫描开销。
Package strmap GC 友好的只读字符串 map:键打包进单一 []byte、int32 开放寻址 哈希表,配合 maphash 种子哈希,避免为海量静态映射(如 header/路由/字典表) 长期持有海量小字符串对象带来的 GC 扫描开销。
Package timex 提供常用的时间操作工具函数。
Package timex 提供常用的时间操作工具函数。
cron
Package cron 提供 Cron 表达式解析和调度功能。
Package cron 提供 Cron 表达式解析和调度功能。
Package urlguard 提供出站 URL 的 SSRF(Server-Side Request Forgery)防护原语, 供「出站目标是用户自配 URL」的服务(webhook 接收器:钉钉/飞书/企微机器人、 告警接入通道等)复用([oekit/httpx#11](https://github.com/oekit/httpx/issues/11))。
Package urlguard 提供出站 URL 的 SSRF(Server-Side Request Forgery)防护原语, 供「出站目标是用户自配 URL」的服务(webhook 接收器:钉钉/飞书/企微机器人、 告警接入通道等)复用([oekit/httpx#11](https://github.com/oekit/httpx/issues/11))。

Jump to

Keyboard shortcuts

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