Documentation
¶
Index ¶
- Constants
- Variables
- func Abs[T Integer](x T) T
- func Equal(a, b float64) bool
- func Filter[T any](slice []T, predicate func(T) bool) []T
- func FindIdx[T cmp.Ordered](aim []T, value T) int
- func Greater(a, b float64) bool
- func GreaterOrEqual(a, b float64) bool
- func RandInterval(b1, b2 int32) int32
- func RandIntervalN(b1, b2 int32, n uint32) []int32
- func SliceDiff[V cmp.Ordered](a, b []V) []V
- func Smaller(a, b float64) bool
- func SmallerOrEqual(a, b float64) bool
- func ToCamelCase(s string) string
- type AESCTRCrypter
- type AESGCMCrypter
- type Flag
- type ICrypter
- type ID
- type IDGenerator
- type Integer
- type Item
- type Items
- func ByFunc[K comparable, V any](m map[K]V, c Less[K, V]) Items[K, V]
- func ByKey[K Ordered, V any](m map[K]V) Items[K, V]
- func ByKeyDesc[K Ordered, V any](m map[K]V) Items[K, V]
- func ByValue[K comparable, V Ordered](m map[K]V) Items[K, V]
- func ByValueDesc[K comparable, V Ordered](m map[K]V) Items[K, V]
- type Less
- type Ordered
- type RSADecrypter
- type RSAEncrypter
- type TopN
Constants ¶
const ( // Epsilon 高精度浮点数误差阈值(10^-8)。 // 适用于科学计算、高精度数值模拟等对精度要求极高的场景。 Epsilon = 0.00000001 // LowEpsilon 低精度浮点数误差阈值(10^-2)。 // 适用于一般业务逻辑、游戏开发、UI 布局等对精度要求适中的场景。 // 本包所有比较函数默认使用此阈值。 LowEpsilon = 0.01 )
Variables ¶
var ( // ErrInvalidPEMBlock 表示 PEM 格式解析失败,通常由文件损坏或格式不正确导致。 ErrInvalidPEMBlock = errors.New("invalid PEM block") // ErrInvalidPrivateKey 表示私钥类型不匹配,非 RSA 私钥或密钥格式错误时触发。 ErrInvalidPrivateKey = errors.New("invalid private key type") // ErrInvalidPublicKey 表示公钥类型不匹配,非 RSA 公钥或密钥格式错误时触发。 ErrInvalidPublicKey = errors.New("invalid public key type") // ErrInvalidAESKeyLength 表示 AES 密钥长度非法。 // 合法长度:16 字节(AES-128)、24 字节(AES-192)、32 字节(AES-256)。 ErrInvalidAESKeyLength = errors.New("AES key length must be 16, 24, or 32 bytes") // ErrInvalidCiphertext 表示密文格式错误或数据被截断/篡改。 ErrInvalidCiphertext = errors.New("invalid ciphertext") )
加密操作相关的预定义错误。
Functions ¶
func Abs ¶
func Abs[T Integer](x T) T
Abs 返回任意数值类型的绝对值。
通过泛型实现,避免为每种数值类型单独编写重载函数。 注意:对 math.MinInt 取绝对值会发生溢出,调用方应自行处理边界情况。
func Equal ¶
Equal 判断两个浮点数是否在误差范围内近似相等。
当两数之差的绝对值小于 LowEpsilon 时视为相等, 有效规避 IEEE 754 精度损失导致的"0.1 + 0.2 != 0.3"等经典问题。
func Filter ¶
Filter 基于谓词函数过滤切片,返回所有满足条件的元素组成的新切片。
惰性分配:结果切片通过 append 动态扩容,避免预分配过多内存。 原切片保持不变,适合函数式风格的数据处理管道。
func FindIdx ¶
FindIdx 在切片中线性搜索目标值,返回首次出现的索引。
适用于无序切片的小规模查找(O(n))。 对于有序切片,建议使用 sort.SearchInts 等二分查找函数以获得 O(log n) 性能。 未找到目标值时返回 -1,与 strings.Index 等标准库保持一致的惯例。
func Greater ¶
Greater 判断 a 是否明显大于 b,差值须超过 LowEpsilon 阈值。
区别于直接使用 > 运算符:当两数差值处于误差范围内时返回 false, 防止将近似相等的值误判为大于关系。
func GreaterOrEqual ¶
GreaterOrEqual 判断 a 是否大于或近似等于 b。
满足以下任一条件即返回 true:
- a 明显大于 b(差值超过 LowEpsilon)
- a 与 b 近似相等(差值在 LowEpsilon 内)
func RandInterval ¶
RandInterval 在闭区间 [b1, b2] 内生成一个均匀分布的随机 int32 整数。
自动处理 b1 > b2 的情况(交换边界),因此参数顺序不影响结果。 当 b1 == b2 时直接返回该值,避免无意义的随机数计算。
func RandIntervalN ¶
RandIntervalN 在闭区间 [b1, b2] 内不重复地随机抽取 n 个整数。
基于 Knuth 洗牌算法(Fisher-Yates)的空间优化变体(Sattolo 算法思想): 使用 map 记录已"虚拟交换"的位置,无需实际构建完整数组, 时间复杂度 O(n),空间复杂度 O(n)(n 远小于区间长度时效率极高)。
当 n 超过区间长度时,自动截断为区间内所有整数。
func SliceDiff ¶
SliceDiff 计算切片 a 相对于切片 b 的差集,即仅在 a 中存在、b 中不存在的元素集合。
时间复杂度:O(n*m),其中 n 和 m 分别为 a 和 b 的长度。 对于大规模数据,建议先将 b 转换为 map 以将复杂度降至 O(n+m)。
func Smaller ¶
Smaller 判断 a 是否明显小于 b,差值须超过 LowEpsilon 阈值。
区别于直接使用 < 运算符:当两数差值处于误差范围内时返回 false, 防止将近似相等的值误判为小于关系。
func SmallerOrEqual ¶
SmallerOrEqual 判断 a 是否小于或近似等于 b。
满足以下任一条件即返回 true:
- a 明显小于 b(差值超过 LowEpsilon)
- a 与 b 近似相等(差值在 LowEpsilon 内)
func ToCamelCase ¶
ToCamelCase 将 snake_case 或其他分隔符风格的字符串转换为 CamelCase(大驼峰)。
支持的分隔符:下划线(_)、空格( )、连字符(-)、点号(.)。 算法逐字节扫描,通过 capNext 标志位控制下一个字母是否需要大写:
- 连续大写字母序列(如 "XML")会被规范化("Xml"),防止与 Go 的命名风格冲突
- 数字后的字母会自动大写(视为新单词的开始)
Types ¶
type AESCTRCrypter ¶
type AESCTRCrypter struct {
// contains filtered or unexported fields
}
AESCTRCrypter 实现 AES-CTR(Counter Mode)流式加密。
CTR 模式通过对自增计数器加密生成密钥流,再与明文异或得到密文, 将块密码转换为流密码,支持任意长度数据的并行加解密。
重要:CTR 模式本身不提供数据完整性保护,若需防篡改, 应在加密后追加 HMAC-SHA256 认证,或直接使用 AES-GCM 模式。
func NewAESCTRCrypter ¶
func NewAESCTRCrypter(key []byte) (*AESCTRCrypter, error)
NewAESCTRCrypter 创建 AES-CTR 加密器实例。
type AESGCMCrypter ¶
type AESGCMCrypter struct {
// contains filtered or unexported fields
}
AESGCMCrypter 实现 AES-GCM(Galois/Counter Mode)认证加密。
GCM 模式是 CTR 模式与 GHASH 认证的组合,在提供加密机密性的同时, 通过 128 位认证标签(Authentication Tag)保证数据完整性, 任何对密文的篡改都会导致解密失败——这是区别于 AES-CTR 的核心优势。 推荐在绝大多数场景下优先使用此模式。
func NewAESGCMCrypter ¶
func NewAESGCMCrypter(key []byte) (*AESGCMCrypter, error)
NewAESGCMCrypter 创建 AES-GCM 加密器实例。
密钥长度决定 AES 安全级别:
- 16 字节 → AES-128(足以应对当前已知威胁)
- 24 字节 → AES-192
- 32 字节 → AES-256(政府机密级别)
type Flag ¶
type Flag uint64
Flag 基于 uint64 的高性能位标记管理器。
利用位运算在单个 uint64 值中同时管理最多 64 个布尔标志, 所有操作均为 O(1) 时间复杂度,内存占用仅 8 字节。 相比 64 个独立 bool 字段节省 56 字节,且缓存友好性更佳。
使用场景:
- 游戏角色状态管理(眩晕、无敌、沉默、隐身等)
- 权限系统的权限位组合管理
- 配置选项的功能开关组合
- 网络协议头部的标志位字段
标志位定义惯例:
const (
FlagRead Flag = 1 << 0 // 0x01
FlagWrite Flag = 1 << 1 // 0x02
FlagExec Flag = 1 << 2 // 0x04
)
注意事项:
- 标志位值应使用 1 << n 的形式定义(n: 0~63)
- 避免使用 0 作为标志位,0 在位运算中无任何效果
- 多个标志位可通过 | 运算符组合使用
func (*Flag) Equal ¶
Equal 判断两个 Flag 值是否完全相同(逐位比较)。
进行精确的全量匹配,所有 64 位都必须相同才返回 true。 与 Include 的包含关系检查不同,此方法不允许额外位的存在。
func (*Flag) Exclude ¶
Exclude 返回清除指定标志位后的新 Flag 值,不修改原值。
使用位清除运算(&^,Go 特有的 AND NOT 运算符)生成新值, 原 Flag 值保持不变,适合在链式操作或临时计算中使用。 如需就地修改,请使用 Flag.Clean 方法。
func (*Flag) Include ¶
Include 判断是否同时包含所有指定标志位(AND 语义)。
通过位与运算 (flag & exp) == exp 实现全量匹配, exp 中的每一个标志位都必须在 flag 中置位才返回 true。
典型用途:验证用户是否同时拥有一组权限。
func (*Flag) IncludeAny ¶
IncludeAny 判断是否包含至少一个指定标志位(OR 语义)。
通过位与运算 (flag & exp) != 0 实现任意匹配, exp 中只要有一个标志位在 flag 中置位即返回 true。
典型用途:验证用户是否拥有候选权限集合中的任意一个。
type ICrypter ¶
type ICrypter interface {
// Encrypt 加密明文数据,返回密文字节数组。
// AES 系列算法的密文中已内嵌 nonce/IV,解密时无需额外传递。
Encrypt(data []byte) ([]byte, error)
// Decrypt 解密密文数据,返回明文字节数组。
// AES-GCM 解密会同时验证认证标签,若标签校验失败则返回错误,表明数据可能已被篡改。
Decrypt(data []byte) ([]byte, error)
}
ICrypter 定义统一的加密解密接口。
所有加密实现(RSA、AES-GCM、AES-CTR)均实现此接口, 通过面向接口编程可在运行时灵活切换加密算法,降低业务代码与具体算法的耦合。
type ID ¶
type ID int64
ID 表示一个全局唯一标识符,底层类型为 int64。
提供类型转换方法和从 ID 中提取时间戳、序列号的分析方法, 便于在排查问题时反解 ID 的生成时间和序列信息。
func ParseString ¶
ParseString 将十进制字符串解析为 ID 类型,用于从 HTTP 请求参数等场景解析 ID。
type IDGenerator ¶
type IDGenerator struct {
// contains filtered or unexported fields
}
IDGenerator 线程安全的 ID 生成器,维护序列计数器和最后时间戳。
并发安全说明:通过 sync.Mutex 保护内部状态,所有并发调用均需获取锁, 确保同一时间戳内的序列号单调递增且不重复。
func (*IDGenerator) NextID ¶
func (s *IDGenerator) NextID() ID
NextID 生成下一个全局唯一 ID,线程安全。
序列号溢出处理策略: 当同一秒内序列号耗尽(超过 2^21)时,主动等待时间推进至下一秒, 而非回绕到 0,确保不同秒之间的 ID 不会出现重叠。
时间戳溢出(约 139 年后)将触发 panic,这是有意为之的防御性设计, 届时系统早应升级或迁移。
type Integer ¶
Integer 泛型数值类型约束,涵盖所有有符号整数和浮点数类型。
使用 ~ 前缀表示底层类型约束,允许基于这些类型定义的自定义类型也满足此约束, 增强了泛型函数对用户自定义数值类型的兼容性。
type Item ¶
type Item[K, V any] struct { Key K Value V }
Item 表示 map 中的键值对元素,用于排序后的有序遍历。
使用结构体封装键值对而非使用匿名接口,保留了类型信息, 使调用方可以直接访问强类型的 Key 和 Value 字段,无需类型断言。
type Items ¶
Items 已排序的键值对切片,提供对排序结果的进一步处理能力。
func ByFunc ¶
func ByFunc[K comparable, V any](m map[K]V, c Less[K, V]) Items[K, V]
ByFunc 使用自定义比较函数对 map 进行排序,返回有序的键值对切片。
内部使用标准库 sort.Sort(内省排序算法),时间复杂度 O(n log n)。 返回的切片按 less 函数定义的顺序排列,调用方可直接遍历使用。
func ByKey ¶
ByKey 按键的自然升序排序 map(键必须满足 Ordered 约束)。
利用标准库 cmp.Less 实现与 Go 内置排序一致的比较语义, 对字符串键会按字典序升序排列,对数值键会按数值升序排列。
func ByValue ¶
func ByValue[K comparable, V Ordered](m map[K]V) Items[K, V]
ByValue 按值的自然升序排序 map(值必须满足 Ordered 约束)。
典型用途:按计数值从小到大排序统计结果。
func ByValueDesc ¶
func ByValueDesc[K comparable, V Ordered](m map[K]V) Items[K, V]
ByValueDesc 按值的自然降序排序 map(值必须满足 Ordered 约束)。
典型用途:按得分从高到低排序排行榜数据。
type Less ¶
Less 定义 map 元素的比较函数类型。
遵循 sort.Interface 的语义:当 x 应排在 y 之前时返回 true。 通过函数参数而非硬编码比较逻辑,使调用方可以自由定义升序、降序或自定义排序规则。
type Ordered ¶
Ordered 所有可排序类型的约束别名,包含 cmp.Ordered 约束所覆盖的所有内置有序类型。
定义为类型别名而非直接使用 cmp.Ordered,便于在本包内统一表达排序语义, 同时保持与标准库的互操作性。
type RSADecrypter ¶
type RSADecrypter struct {
// contains filtered or unexported fields
}
RSADecrypter 使用 RSA 私钥和 OAEP 填充方案解密数据。
OAEP(Optimal Asymmetric Encryption Padding)相比传统 PKCS#1 v1.5 填充 能有效抵御选择密文攻击,是当前 RSA 加密的推荐填充方案。 内部采用 SHA-256 作为哈希函数,提供更强的安全性。
密钥格式支持:
- PKCS#8(推荐):跨语言兼容性好,适合现代系统
- PKCS#1(兼容旧系统):创建时自动回退尝试
func NewRSADecrypter ¶
func NewRSADecrypter(priKey []byte) (*RSADecrypter, error)
NewRSADecrypter 解析 PEM 格式的 RSA 私钥并创建解密器实例。
解析策略:优先尝试 PKCS#8 格式,失败后自动回退至 PKCS#1 格式, 兼容新旧两种密钥格式,无需调用方手动区分。
type RSAEncrypter ¶
type RSAEncrypter struct {
// contains filtered or unexported fields
}
RSAEncrypter 使用 RSA 公钥和 OAEP 填充方案加密数据。
公钥加密,私钥解密——任何持有公钥的一方均可加密, 但只有持有对应私钥的一方才能解密,适合安全传递对称密钥等场景。
func NewRSAEncrypter ¶
func NewRSAEncrypter(pubKey []byte) (*RSAEncrypter, error)
NewRSAEncrypter 解析 PKIX 格式的 PEM 公钥并创建加密器实例。
type TopN ¶
type TopN[T any] struct { // contains filtered or unexported fields }
TopN 维护 Top-N 最大(或最小)元素的有序容器。
通过自定义比较器定义"最大"的语义,自动维护容量为 n 的有序切片。 每次 Put 操作均保持切片有序,超出容量时自动丢弃末位元素。
时间复杂度:Put 操作为 O(n)(线性插入),Size/Get/Range 为 O(1)。 空间复杂度:O(n),仅保留 n 个元素。
典型用途:实时维护游戏排行榜 Top-N、统计最热门 N 个词等场景。
func NewTopN ¶
NewTopN 创建指定容量的 TopN 容器。
comparer 函数定义了元素的排序语义:
- 返回正数表示 a > b(a 优先于 b,排在更前面)
- 返回负数表示 a < b(b 优先于 a)
- 返回 0 表示 a == b(同等优先级)
预分配 n 容量的底层切片,避免频繁扩容。
func (*TopN[T]) GetAll ¶
func (t *TopN[T]) GetAll() []T
GetAll 返回当前所有元素的深拷贝切片。
返回独立副本而非切片视图,防止调用方的修改影响内部状态, 是防御性编程的体现。
func (*TopN[T]) Put ¶
func (t *TopN[T]) Put(item T)
Put 将新元素插入到有序切片的正确位置。
若容器已满且新元素不优于最末尾元素,则直接丢弃; 否则在找到正确位置后插入,并截断超出容量的末尾元素。