utility

package module
v0.0.0-...-595b576 Latest Latest
Warning

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

Go to latest
Published: Feb 27, 2026 License: Apache-2.0 Imports: 19 Imported by: 0

README

🛠️ Utility

Go Version


📖 项目简介 (Introduction)

🎯 一句话概述

Utility 是一个为 荒野地图 开发者打造的高性能通用工具库,专注于后端系统的基础设施建设。

💡 项目背景与价值

在后端开发过程中,开发者经常需要重复实现诸如 ID 生成、加密解密、网络通信、配置加载等基础功能。这些"轮子"的重复造就不仅浪费时间,还容易引入潜在的 bug 和性能问题。

Utility 应运而生,它提供了一套经过生产环境验证的、开箱即用的核心组件集合,涵盖:

  • 🔢 基础工具层:数值计算、ID 生成、加密解密、数据结构
  • 🌐 网络通信层:多协议服务器(TCP/KCP/WebSocket)、连接管理
  • 🏗️ 应用框架层:模块化架构、生命周期管理、事件总线
  • 📦 中间件集成:RabbitMQ 客户端、日志系统、脚本执行器
  • ⚙️ 配置管理层:TSV 热加载、类型安全解析
🎯 主要应用场景
  • 游戏服务器开发:坐标计算、战斗逻辑、状态管理、配置热更新
  • 微服务架构:分布式 ID、消息队列、服务通信、日志追踪
  • 高并发系统:网络连接管理、协议多路复用、优雅关闭
  • 数据密集型应用:加密传输、配置管理、脚本动态执行

✨ 核心特性 (Features)

⚡ 高性能基础库
  • 🆔 IDGen (分布式 ID 生成器)

    • 基于改进的 Snowflake 算法(42 位时间戳 + 21 位序列号)
    • 支持 139 年时间跨度,每秒生成 210 万唯一 ID
    • 线程安全,支持高并发场景
    • 内置时间戳与序列号提取功能
  • 🔍 Accuracy (浮点数精度比较)

    • 解决浮点数 == 比较的精度误差问题
    • 提供 EqualGreaterSmaller 等高级比较方法
    • 支持自定义精度阈值(Epsilon / LowEpsilon)
    • 适用场景:游戏坐标、金融计算、物理模拟
  • 🔐 Crypto (企业级加密工具)

    • RSA-OAEP:非对称加密,支持 PKCS#1/PKCS#8 密钥格式
    • AES-GCM:认证加密(推荐),提供机密性与完整性双重保护
    • AES-CTR:流式加密,适合大数据加密
    • 统一的 ICrypter 接口设计,便于算法切换
  • 📊 高性能数据结构

    • Flag:64 位标记系统,内存占用仅 8 字节,支持位运算
    • TopN:泛型 Top-N 容器,自动维护最大/最小 N 个元素
    • SortMap:Map 排序工具,支持按键/值升降序排序
🛠️ 强大的模块组件
  • 🏗️ App Framework (应用框架)

    • 模块化架构设计,支持动态模块加载/卸载
    • 完整的生命周期管理(Init → Run → Close)
    • 内置 ChanRPC 通道,支持模块间异步通信
    • 支持模块状态监控与统计
  • 🌐 XNet (多协议网络服务器)

    • 协议支持:TCP、KCP(可靠 UDP)、WebSocket
    • 连接复用:基于 cmux 的智能协议分流
    • 高并发设计:Goroutine Pool、连接计数、优雅关闭
    • 安全特性:支持 HAProxy PROXY 协议、Panic 恢复
    • 跨平台:支持 Windows 命名管道、Unix Domain Socket
  • 📄 TSV Config (配置管理)

    • 支持热加载(文件变更自动重载)
    • 泛型设计,类型安全的配置访问
    • 支持 JSON 嵌套字段解析
    • 自动类型转换(int/float/bool/string/json)
    • 线程安全读写
  • 📢 Event Bus (事件总线)

    • 轻量级进程内发布/订阅模式
    • 支持监听器优先级排序
    • 快速注册接口(QuickRegister
    • 自动清理空监听集合,防止内存泄漏
  • 📝 XLog (高性能日志)

    • 基于 Uber Zap 构建,性能极致
    • 提供 Sugar 风格的便捷 API
    • 支持结构化日志与格式化日志
    • 灵活的日志级别控制
  • 🐍 XExec (脚本执行器)

    • 支持 Python、Shell、PowerShell、Batch 脚本
    • 环境变量隔离与工作目录控制
    • 实时输出捕获(stdout/stderr)
    • 超时控制与优雅终止
    • 注入式测试支持(便于单元测试)
  • ⏰ XTime (时间工具库)

    • 时间偏移功能(用于测试/调试时间相关逻辑)
    • 毫秒/秒/微秒级时间戳转换
    • 支持 UTC 与本地时间切换
    • 今日零点、下一日零点等常用时间计算
  • 🐰 XAMQP (RabbitMQ 客户端)

    • 封装 amqp091-go,简化 RabbitMQ 操作
    • 自动重连机制,支持连接断线重试
    • 声明式队列/交换机/绑定管理
    • 支持发布/订阅、工作队列等模式

🚀 使用指南 (Usage)

1. 安装依赖
# 获取最新版本
go get github.com/wildmap/utility@latest

# 或指定版本
go get github.com/wildmap/[email protected]
2. 快速开始
🆔 分布式 ID 生成 (IDGen)
package main

import (
	"fmt"
	"github.com/wildmap/utility"
)

func main() {
	// 生成全局唯一 ID
	id := utility.NextID()
	
	fmt.Printf("ID: %d\n", id.Int64())          // 数值形式
	fmt.Printf("String: %s\n", id.String())     // 字符串形式
	fmt.Printf("生成时间: %v\n", id.Time())       // 提取时间戳
	fmt.Printf("序列号: %d\n", id.Seq())          // 提取序列号
	
	// 从字符串解析 ID
	parsed, _ := utility.ParseString("123456789")
	fmt.Printf("解析结果: %d\n", parsed.Int64())
}

输出示例:

ID: 187649984473252865
String: 187649984473252865
生成时间: 2026-02-03 15:17:30 +0800 CST
序列号: 1
🔍 浮点数精度比较 (Accuracy)
package main

import (
	"fmt"
	"github.com/wildmap/utility"
)

func main() {
	// 普通比较(错误示范)
	a, b := 0.1+0.2, 0.3
	fmt.Printf("0.1 + 0.2 == 0.3: %v\n", a == b)  // false(精度问题)
	
	// 使用 Accuracy 比较(正确做法)
	fmt.Printf("Equal: %v\n", utility.Equal(a, b))              // true
	fmt.Printf("Greater: %v\n", utility.Greater(1.02, 1.0))     // true
	fmt.Printf("GreaterOrEqual: %v\n", utility.GreaterOrEqual(1.005, 1.0)) // true(近似相等)
}
🔐 加密解密 (Crypto)
package main

import (
	"fmt"
	"github.com/wildmap/utility"
)

func main() {
	// 1. AES-GCM 认证加密(推荐用于数据传输)
	key := []byte("1234567890123456") // 16 bytes (AES-128)
	crypter, _ := utility.NewAESGCMCrypter(key)
	
	plaintext := []byte("敏感数据")
	ciphertext, _ := crypter.Encrypt(plaintext)
	decrypted, _ := crypter.Decrypt(ciphertext)
	
	fmt.Printf("原文: %s\n", plaintext)
	fmt.Printf("密文: %x...\n", ciphertext[:16]) // 十六进制显示
	fmt.Printf("解密: %s\n", decrypted)
	
	// 2. RSA 非对称加密(用于密钥交换)
	publicKeyPEM := []byte(`-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
-----END PUBLIC KEY-----`)
	
	encrypter, _ := utility.NewRSAEncrypter(publicKeyPEM)
	encrypted, _ := encrypter.Encrypt([]byte("secret key"))
	fmt.Printf("RSA 加密: %x...\n", encrypted[:16])
}
🏴 位标记管理 (Flag)
package main

import (
	"fmt"
	"github.com/wildmap/utility"
)

// 定义权限标志
const (
	PermRead    utility.Flag = 1 << 0  // 0x01 读权限
	PermWrite   utility.Flag = 1 << 1  // 0x02 写权限
	PermExecute utility.Flag = 1 << 2  // 0x04 执行权限
	PermDelete  utility.Flag = 1 << 3  // 0x08 删除权限
)

func main() {
	var userPerms utility.Flag
	
	// 设置权限
	userPerms.Set(PermRead | PermWrite)
	fmt.Printf("权限值: %08b\n", userPerms)  // 二进制: 00000011
	
	// 检查权限
	fmt.Printf("有读权限: %v\n", userPerms.Include(PermRead))        // true
	fmt.Printf("有写和执行权限: %v\n", userPerms.Include(PermWrite | PermExecute)) // false
	fmt.Printf("有读或执行权限: %v\n", userPerms.IncludeAny(PermRead | PermExecute)) // true
	
	// 清除权限
	userPerms.Clean(PermWrite)
	fmt.Printf("清除写权限后: %08b\n", userPerms)  // 00000001
}
📊 Top-N 排序容器
package main

import (
	"fmt"
	"github.com/wildmap/utility"
)

type Player struct {
	Name  string
	Score int
}

func main() {
	// 维护分数最高的 3 名玩家
	topN := utility.NewTopN[Player](3, func(a, b Player) int {
		return a.Score - b.Score  // 按分数升序排列
	})
	
	// 添加玩家
	players := []Player{
		{"Alice", 95}, {"Bob", 87}, {"Charlie", 92},
		{"David", 78}, {"Eve", 99},
	}
	
	for _, p := range players {
		topN.Put(p)
	}
	
	// 遍历前 3 名
	fmt.Println("排行榜 Top 3:")
	topN.Range(func(i int, p Player) bool {
		fmt.Printf("%d. %s: %d 分\n", i+1, p.Name, p.Score)
		return false
	})
}

输出:

排行榜 Top 3:
1. Eve: 99 分
2. Alice: 95 分
3. Charlie: 92 分
📄 TSV 配置加载

配置文件:config/items.tsv

ID	Name	Level	Attributes
编号	名称	等级	属性
#int	string	int	json
1001	铁剑	5	{"atk": 50, "def": 10}
1002	钢盾	8	{"atk": 20, "def": 80}
1003	法杖	10	{"atk": 100, "magic": 200}

加载代码:

package main

import (
	"fmt"
	"github.com/wildmap/utility/tsv"
)

type ItemConf struct {
	ID         int                    `json:"ID"`
	Name       string                 `json:"Name"`
	Level      int                    `json:"Level"`
	Attributes map[string]interface{} `json:"Attributes"`
}

func main() {
	// 加载配置(Key 为 int 类型的 ID)
	conf, err := tsv.New[int, *ItemConf]("./config")
	if err != nil {
		panic(err)
	}
	
	// 获取单个配置
	if item := conf.Get(1001); item != nil {
		fmt.Printf("物品: %s (Lv.%d)\n", item.Name, item.Level)
		fmt.Printf("攻击力: %.0f\n", item.Attributes["atk"])
	}
	
	// 遍历所有配置
	conf.Range(func(id int, item *ItemConf) bool {
		fmt.Printf("[%d] %s\n", id, item.Name)
		return false  // 返回 true 可中断遍历
	})
}
📡 网络服务器 (XNet)
package main

import (
	"context"
	"fmt"
	"github.com/wildmap/utility/xlog"
	"github.com/wildmap/utility/xnet"
)

// 实现 IAgent 接口
type GameAgent struct {
	conn xnet.IConn
}

func (a *GameAgent) OnInit(ctx context.Context) error {
	xlog.Infof("客户端连接: %s", a.conn.RemoteAddr())
	return nil
}

func (a *GameAgent) Run(ctx context.Context) {
	for {
		// 读取消息
		msg, err := a.conn.ReadMsg()
		if err != nil {
			xlog.Errorf("读取消息失败: %v", err)
			return
		}
		
		xlog.Infof("收到消息: %s", string(msg))
		
		// 回复消息
		response := []byte(fmt.Sprintf("服务器收到: %s", msg))
		if err := a.conn.WriteMsg(response); err != nil {
			xlog.Errorf("发送消息失败: %v", err)
			return
		}
	}
}

func (a *GameAgent) OnClose(ctx context.Context) {
	xlog.Infof("客户端断开: %s", a.conn.RemoteAddr())
}

func main() {
	// 创建支持 TCP/WebSocket/KCP 的服务器
	server := xnet.NewServer(":8080", func(conn xnet.IConn) xnet.IAgent {
		return &GameAgent{conn: conn}
	})
	
	xlog.Info("启动游戏服务器...")
	if err := server.Start(); err != nil {
		panic(err)
	}
	
	// 优雅关闭(通常在信号处理中调用)
	// server.Stop()
}
📢 事件总线 (Event)
package main

import (
	"fmt"
	"github.com/wildmap/utility/event"
)

func main() {
	bus := event.NewFacade()
	
	// 注册监听器(支持优先级)
	bus.QuickRegister("user.login", 10, func(data map[string]any) {
		fmt.Printf("用户登录: %s\n", data["username"])
	})
	
	bus.QuickRegister("user.login", 5, func(data map[string]any) {
		fmt.Println("记录登录日志")  // 优先级低,后执行
	})
	
	// 触发事件
	bus.Fire("user.login", map[string]any{
		"username": "Alice",
		"ip":       "192.168.1.100",
	})
}

输出(按优先级排序):

用户登录: Alice
记录登录日志
🐍 脚本执行 (XExec)
package main

import (
	"fmt"
	"github.com/wildmap/utility/xexec"
)

func main() {
	// 执行 Python 脚本
	script := xexec.NewPythonScript("print('Hello from Python!')")
	output, err := script.Run()
	if err != nil {
		panic(err)
	}
	fmt.Printf("Python 输出: %s\n", output)
	
	// 执行 Shell 命令(跨平台)
	shellScript := xexec.NewShellScript("echo 'Hello World'")
	shellOutput, _ := shellScript.Run()
	fmt.Printf("Shell 输出: %s\n", shellOutput)
}
⏰ 时间工具 (XTime)
package main

import (
	"fmt"
	"github.com/wildmap/utility/xtime"
	"time"
)

func main() {
	// 获取当前时间戳
	fmt.Printf("当前毫秒时间戳: %d\n", xtime.NowTs())
	fmt.Printf("当前秒时间戳: %d\n", xtime.NowSecTs())
	
	// 时间戳转换
	ms := xtime.NowTs()
	t := xtime.Ms2Time(ms)
	fmt.Printf("时间对象: %v\n", t)
	
	// 时间偏移(用于测试)
	xtime.SetUseOffset(true)
	xtime.AddOffset(24 * time.Hour)  // 将当前时间推进一天
	fmt.Printf("偏移后时间: %v\n", xtime.Now())
	
	// 今日零点
	todayStart := xtime.TodayStartTs()
	fmt.Printf("今日零点: %s\n", xtime.FormatMs(todayStart))
}

Documentation

Index

Constants

View Source
const (
	// Epsilon 高精度浮点数比较阈值
	// 值:0.00000001 (10^-8)
	// 适用场景:科学计算、高精度数值模拟
	Epsilon = 0.00000001

	// LowEpsilon 低精度浮点数比较阈值
	// 值:0.01 (10^-2)
	// 适用场景:一般业务逻辑、游戏开发、UI布局计算
	// 注意:本包所有比较函数默认使用此阈值
	LowEpsilon = 0.01
)

Variables

View Source
var (
	// ErrInvalidPEMBlock PEM 格式解析失败
	// 可能原因:文件不是 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 返回给定数字的绝对值 泛型函数,可用于任何满足Integer约束的类型 参数: x - 任意数值类型 返回: x的绝对值

func Equal

func Equal(a, b float64) bool

Equal 判断两个浮点数是否近似相等

比较逻辑:|a - b| < LowEpsilon

参数:

a - 第一个浮点数
b - 第二个浮点数

返回值:

true  - 两数之差的绝对值小于 LowEpsilon,视为相等
false - 两数差异超过阈值,视为不等

示例:

Equal(0.01, 0.02)   // false,差值 0.01 等于阈值
Equal(1.001, 1.002) // true,差值 0.001 小于阈值
Equal(0.0, 0.009)   // true,差值在误差范围内

func Filter

func Filter[T any](slice []T, predicate func(T) bool) []T

Filter 基于谓词函数过滤切片 参数: slice - 源切片, predicate - 过滤条件函数 返回: 包含所有满足条件元素的新切片

func FindIdx

func FindIdx[T cmp.Ordered](aim []T, value T) int

FindIdx 在切片中搜索值并返回其索引 参数: aim - 要搜索的切片, value - 要查找的值 返回: 如果找到返回从0开始的索引,未找到返回-1 泛型函数,适用于任何有序类型(整数、浮点数、字符串等)

func Greater

func Greater(a, b float64) bool

Greater 判断 a 是否明显大于 b

比较逻辑:a > b 且 (a - b) > LowEpsilon 注意:a 必须明显大于 b,不包括近似相等的情况

参数:

a - 第一个浮点数
b - 第二个浮点数

返回值:

true  - a 明显大于 b(差值超过 LowEpsilon)
false - a 小于等于 b,或者差值在误差范围内

示例:

Greater(1.02, 1.0)  // true,差值 0.02 > LowEpsilon
Greater(1.005, 1.0) // false,差值小于阈值

func GreaterOrEqual

func GreaterOrEqual(a, b float64) bool

GreaterOrEqual 判断 a 是否大于等于 b

比较逻辑:a > b 或 |a - b| < LowEpsilon 注意:包括明显大于和近似相等两种情况

参数:

a - 第一个浮点数
b - 第二个浮点数

返回值:

true  - a 大于 b 或两者近似相等
false - a 明显小于 b

示例:

GreaterOrEqual(1.02, 1.0)  // true,大于
GreaterOrEqual(1.005, 1.0) // true,近似相等
GreaterOrEqual(0.98, 1.0)  // false,明显小于

func RandInterval

func RandInterval(b1, b2 int32) int32

RandInterval 在[b1,b2]区间内生成一个随机整数 参数: b1 - 区间下界, b2 - 区间上界 返回: [b1,b2]区间内的随机int32值

func RandIntervalN

func RandIntervalN(b1, b2 int32, n uint32) []int32

RandIntervalN 在[b1, b2]区间内不重复地随机选择N个整数 使用Fisher-Yates洗牌算法的优化版本 参数: b1 - 区间下界, b2 - 区间上界, n - 要选择的数量 返回: 包含n个不重复随机数的切片

func SliceDiff

func SliceDiff[V cmp.Ordered](a, b []V) []V

SliceDiff 计算切片a中存在但b中不存在的元素(差集) 参数: a - 第一个切片, b - 第二个切片 返回: 只在a中存在的元素切片

func Smaller

func Smaller(a, b float64) bool

Smaller 判断 a 是否明显小于 b

比较逻辑:a < b 且 (b - a) > LowEpsilon 注意:a 必须明显小于 b,不包括近似相等的情况

参数:

a - 第一个浮点数
b - 第二个浮点数

返回值:

true  - a 明显小于 b(差值超过 LowEpsilon)
false - a 大于等于 b,或者差值在误差范围内

示例:

Smaller(1.0, 1.02)  // true,差值 0.02 > LowEpsilon
Smaller(1.0, 1.005) // false,差值小于阈值

func SmallerOrEqual

func SmallerOrEqual(a, b float64) bool

SmallerOrEqual 判断 a 是否小于等于 b

比较逻辑:a < b 或 |a - b| < LowEpsilon 注意:包括明显小于和近似相等两种情况

参数:

a - 第一个浮点数
b - 第二个浮点数

返回值:

true  - a 小于 b 或两者近似相等
false - a 明显大于 b

示例:

SmallerOrEqual(1.0, 1.02)  // true,小于
SmallerOrEqual(1.0, 1.005) // true,近似相等
SmallerOrEqual(1.02, 1.0)  // false,明显大于

func ToCamelCase

func ToCamelCase(s string) string

ToCamelCase 通用的 snake_case 到 CamelCase 转换

Types

type AESCTRCrypter

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

AESCTRCrypter 实现CTR(Counter,计数器)模式的AES加密 注意: CTR模式不提供认证功能。如需认证加密,请使用AES-GCM CTR模式将块密码转换为流密码,适合加密任意长度的数据

func NewAESCTRCrypter

func NewAESCTRCrypter(key []byte) (*AESCTRCrypter, error)

NewAESCTRCrypter 创建一个新的AES-CTR加密器实例 参数: key - AES密钥,长度必须是16、24或32字节 返回: AES-CTR加密器实例和可能的错误

func (*AESCTRCrypter) Decrypt

func (c *AESCTRCrypter) Decrypt(ciphertext []byte) ([]byte, error)

Decrypt 使用AES-CTR模式解密密文 参数: ciphertext - 包含IV+密文的字节数组 返回: 解密后的明文和可能的错误

func (*AESCTRCrypter) Encrypt

func (c *AESCTRCrypter) Encrypt(plaintext []byte) ([]byte, error)

Encrypt 使用AES-CTR模式加密明文 会生成随机IV(初始化向量)并附加到密文前面 参数: plaintext - 待加密的明文 返回: IV+密文 的组合字节数组和可能的错误

type AESGCMCrypter

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

AESGCMCrypter 实现使用AES-GCM模式的认证加密 这是推荐的方法,因为它同时提供机密性和真实性保护 GCM模式会自动生成认证标签,防止密文被篡改

func NewAESGCMCrypter

func NewAESGCMCrypter(key []byte) (*AESGCMCrypter, error)

NewAESGCMCrypter 创建一个新的AES-GCM加密器实例 参数: key - AES密钥,长度必须是16(AES-128)、24(AES-192)或32(AES-256)字节 返回: AES-GCM加密器实例和可能的错误

func (*AESGCMCrypter) Decrypt

func (c *AESGCMCrypter) Decrypt(ciphertext []byte) ([]byte, error)

Decrypt 使用AES-GCM解密密文并验证认证标签 参数: ciphertext - 包含nonce+密文+认证标签的字节数组 返回: 解密后的明文和可能的错误 注意: 如果认证标签验证失败,会返回错误,表示数据可能被篡改

func (*AESGCMCrypter) Encrypt

func (c *AESGCMCrypter) Encrypt(plaintext []byte) ([]byte, error)

Encrypt 使用AES-GCM加密明文 会自动生成随机nonce并附加到密文前面 参数: plaintext - 待加密的明文 返回: nonce+密文+认证标签 的组合字节数组和可能的错误

type Flag

type Flag uint64

Flag 位标记管理器

基于 uint64 类型实现的高性能位标记系统,支持同时管理64个布尔标志。 使用位运算实现,性能优异,内存占用仅8字节。

设计特点:

  • 内存高效:64个布尔标志仅占用8字节(相比64个bool节省56字节)
  • 性能优异:所有操作都是O(1)时间复杂度的位运算
  • 类型安全:通过 Flag 类型包装,避免直接操作整数

使用场景:

  • 游戏中的角色状态管理(眩晕、无敌、沉默等)
  • 权限系统的权限位管理
  • 配置选项的开关组合
  • 网络协议的标志位字段

示例用法:

const (
    FlagRead   Flag = 1 << 0  // 0x01
    FlagWrite  Flag = 1 << 1  // 0x02
    FlagExec   Flag = 1 << 2  // 0x04
)

var permissions Flag
permissions.Set(FlagRead | FlagWrite)  // 设置读写权限
if permissions.Include(FlagWrite) {     // 检查写权限
    // 执行写操作
}

注意事项:

  • 标志位定义建议使用 1 << n 的形式(n: 0-63)
  • 避免使用0作为标志位,因为它在位运算中不起作用
  • 标志位可以通过 | 运算符组合使用

func (*Flag) Clean

func (flag *Flag) Clean(f Flag)

Clean 清除指定的一个或多个标志位

操作:将指定标志位置为0,不影响其他位 位运算:flag = flag &^ f

参数:

f - 要清除的标志位,可以是单个标志或多个标志的组合

示例:

flags.Clean(Flag1)            // 清除单个标志
flags.Clean(Flag1 | Flag2)    // 同时清除多个标志

注意:

  • 清除未设置的标志位是安全的,不会产生副作用
  • 此方法会直接修改原 Flag 值

func (*Flag) Equal

func (flag *Flag) Equal(s Flag) bool

Equal 判断两个 Flag 是否完全相等

比较逻辑:逐位比较,所有64位都必须相同

参数:

s - 要比较的 Flag 值

返回值:

true  - 两个 Flag 的所有标志位都相同
false - 至少有一个标志位不同

示例:

flags1 := Flag1 | Flag2
flags2 := Flag1 | Flag2
flags3 := Flag1 | Flag3
flags1.Equal(flags2)  // true,完全相同
flags1.Equal(flags3)  // false,Flag2 和 Flag3 不同

注意:

  • 此方法进行的是精确比较,不是包含关系检查
  • 如需检查包含关系,请使用 Include 或 IncludeAny 方法

func (*Flag) Exclude

func (flag *Flag) Exclude(s Flag) Flag

Exclude 返回移除指定标志位后的新值(不修改原值)

操作:生成一个新的 Flag,其中不包含指定的标志位 位运算:result = flag &^ s

参数:

s - 要排除的标志位

返回值:

排除指定标志位后的新 Flag 值

示例:

flags := Flag1 | Flag2 | Flag3
newFlags := flags.Exclude(Flag2)   // newFlags = Flag1 | Flag3
// flags 保持不变,仍为 Flag1 | Flag2 | Flag3

注意:

  • 此方法不会修改原 Flag 值,返回新值
  • 排除未设置的标志位是安全的,返回值与原值相同
  • 如需直接修改原值,请使用 Clean 方法

func (*Flag) Include

func (flag *Flag) Include(exp Flag) bool

Include 判断是否包含所有指定的标志位(AND 逻辑)

检查逻辑:exp 中的每一个标志位都必须在 flag 中被设置 位运算:(flag & exp) == exp

参数:

exp - 期望包含的标志位组合

返回值:

true  - flag 包含 exp 中的所有标志位
false - flag 缺少 exp 中的至少一个标志位

示例:

flags := Flag1 | Flag2 | Flag3
flags.Include(Flag1)               // true,包含 Flag1
flags.Include(Flag1 | Flag2)       // true,包含 Flag1 和 Flag2
flags.Include(Flag1 | Flag4)       // false,缺少 Flag4
flags.Include(0)                   // true,空集是任何集合的子集

应用场景:

  • 权限检查:验证用户是否同时拥有多个权限
  • 状态检查:验证对象是否同时处于多个状态

func (*Flag) IncludeAny

func (flag *Flag) IncludeAny(exp Flag) bool

IncludeAny 判断是否包含任意一个指定的标志位(OR 逻辑)

检查逻辑:exp 中只要有任意一个标志位在 flag 中被设置即可 位运算:(flag & exp) != 0

参数:

exp - 候选标志位组合

返回值:

true  - flag 至少包含 exp 中的一个标志位
false - flag 不包含 exp 中的任何标志位

示例:

flags := Flag1 | Flag2
flags.IncludeAny(Flag1)            // true,包含 Flag1
flags.IncludeAny(Flag3 | Flag4)    // false,都不包含
flags.IncludeAny(Flag1 | Flag3)    // true,包含 Flag1
flags.IncludeAny(0)                // false,空集合

应用场景:

  • 权限检查:验证用户是否拥有多个权限中的至少一个
  • 状态检查:验证对象是否处于多个状态中的任意一个

func (*Flag) Set

func (flag *Flag) Set(f Flag)

Set 设置指定的一个或多个标志位

操作:将指定标志位置为1,不影响其他位 位运算:flag = flag | f

参数:

f - 要设置的标志位,可以是单个标志或多个标志的组合(使用 | 连接)

示例:

var flags Flag
flags.Set(Flag1)              // 设置单个标志
flags.Set(Flag1 | Flag2)      // 同时设置多个标志
flags.Set(Flag1)
flags.Set(Flag2)              // 分步设置,效果同上

注意:

  • 重复设置同一标志位是安全的,不会产生副作用
  • 此方法会直接修改原 Flag 值

type ICrypter

type ICrypter interface {
	// Encrypt 加密明文数据
	//
	// 参数:
	//   data - 待加密的明文字节数组
	//
	// 返回值:
	//   []byte - 加密后的密文字节数组
	//   error  - 加密失败时的错误信息
	//
	// 注意:
	//   - RSA 加密有数据长度限制
	//   - AES 加密的密文长度会比明文长(包含 nonce/IV)
	Encrypt(data []byte) ([]byte, error)

	// Decrypt 解密密文数据
	//
	// 参数:
	//   data - 待解密的密文字节数组
	//
	// 返回值:
	//   []byte - 解密后的明文字节数组
	//   error  - 解密失败时的错误信息(密钥错误、密文损坏等)
	//
	// 注意:
	//   - 必须使用对应的密钥和算法进行解密
	//   - AES-GCM 解密时会验证认证标签,失败则返回错误
	Decrypt(data []byte) ([]byte, error)
}

ICrypter 定义加密器的统一接口

所有加密实现(RSA、AES-GCM、AES-CTR)都实现此接口, 提供统一的加密解密方法,便于算法切换和模块化设计。

实现类:

  • RSAEncrypter / RSADecrypter:非对称加密
  • AESGCMCrypter:认证加密(推荐)
  • AESCTRCrypter:流式加密

使用模式:

var crypter ICrypter
crypter = NewAESGCMCrypter(key)
ciphertext, err := crypter.Encrypt(plaintext)
plaintext, err := crypter.Decrypt(ciphertext)

type ID

type ID int64

ID 表示一个唯一标识符,基于int64类型 提供了类型转换和提取时间戳/序列号组件的方法

func NextID

func NextID() ID

NextID 使用全局生成器生成一个新的唯一ID 这是创建新ID的主要函数

func ParseID

func ParseID(id uint64) ID

ParseID 将uint64值转换为ID类型 用于从存储或网络反序列化ID

func ParseString

func ParseString(id string) (ID, error)

ParseString 将字符串表示转换为ID 参数: id - 十进制字符串形式的ID 返回: ID实例和可能的解析错误

func (ID) Bytes

func (i ID) Bytes() []byte

Bytes 将ID转换为其字符串表示的字节切片

func (ID) Float64

func (i ID) Float64() float64

Float64 将ID转换为64位浮点数

func (ID) Int64

func (i ID) Int64() int64

Int64 将ID转换为有符号64位整数

func (ID) Seq

func (i ID) Seq() uint64

Seq 提取并返回ID的序列号组件 序列号存储在ID的低21位中

func (ID) String

func (i ID) String() string

String 将ID转换为字符串表示

func (ID) Time

func (i ID) Time() time.Time

Time 提取并返回ID的时间戳组件(time.Time对象) 时间戳存储在ID的高42位中

func (ID) Uint64

func (i ID) Uint64() uint64

Uint64 将ID转换为无符号64位整数

type IDGenerator

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

IDGenerator ID生成器的核心结构 维护序列计数器和最后时间戳以确保唯一性

func NewGenerator

func NewGenerator() *IDGenerator

NewGenerator 创建并初始化一个新的ID生成器实例 将初始序列设置为1并记录当前时间戳

func (*IDGenerator) NextID

func (s *IDGenerator) NextID() ID

NextID 生成下一个唯一ID 通过推进时间戳和重置序列来处理序列溢出 通过互斥锁确保线程安全

type Integer

type Integer interface {
	~int | ~int8 | ~int16 | ~int32 | ~int64 | ~float32 | ~float64
}

Integer 泛型类型约束,包含所有整数和浮点数类型 允许函数使用任何数值类型

type Item

type Item[K, V any] struct {
	Key   K // 键
	Value V // 值
}

Item 表示map中的键值对元素 K是键的类型, V是值的类型

type Items

type Items[K, V any] []Item[K, V]

Items map元素(键值对)的切片 提供用于处理已排序map结果的实用方法

func ByFunc

func ByFunc[K comparable, V any](m map[K]V, c Less[K, V]) Items[K, V]

ByFunc 使用提供的比较函数对map进行排序 参数: m - 要排序的map, c - 比较函数 返回: 已排序的Items切片

func ByKey

func ByKey[K Ordered, V any](m map[K]V) Items[K, V]

ByKey 按键升序对map排序 K必须是Ordered类型(支持比较)

func ByKeyDesc

func ByKeyDesc[K Ordered, V any](m map[K]V) Items[K, V]

ByKeyDesc 按键降序对map排序 K必须是Ordered类型(支持比较)

func ByValue

func ByValue[K comparable, V Ordered](m map[K]V) Items[K, V]

ByValue 按值升序对map排序 V必须是Ordered类型(支持比较)

func ByValueDesc

func ByValueDesc[K comparable, V Ordered](m map[K]V) Items[K, V]

ByValueDesc 按值降序对map排序 V必须是Ordered类型(支持比较)

func (Items[K, V]) Top

func (r Items[K, V]) Top(n int) Items[K, V]

Top 返回最多包含前n个元素的切片 如果n大于Items长度,返回所有元素

type Less

type Less[K, V any] func(x, y Item[K, V]) bool

Less map元素的比较函数类型 如果x应该排在y之前则返回true

type Ordered

type Ordered cmp.Ordered

Ordered 定义所有可排序类型的类型约束 包含所有实现cmp.Ordered接口的类型

type RSADecrypter

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

RSADecrypter RSA 解密器

使用 RSA 私钥和 OAEP 填充方案解密数据。 采用 SHA-256 哈希函数,提供更高的安全性。

密钥格式支持:

  • PKCS#8:推荐格式,跨语言兼容性好
  • PKCS#1:传统格式,主要用于兼容旧系统

使用示例:

decrypter, err := NewRSADecrypter(privateKeyPEM)
if err != nil {
    log.Fatal(err)
}
plaintext, err := decrypter.Decrypt(ciphertext)

func NewRSADecrypter

func NewRSADecrypter(priKey []byte) (*RSADecrypter, error)

NewRSADecrypter 创建 RSA 解密器实例

自动识别并解析 PKCS#8 和 PKCS#1 两种密钥格式。 解析策略:优先尝试 PKCS#8,失败后回退到 PKCS#1。

参数:

priKey - PEM 格式的 RSA 私钥字节数组

返回值:

*RSADecrypter - RSA 解密器实例
error - 解析失败时返回错误

错误类型:

  • ErrInvalidPEMBlock:PEM 格式解析失败
  • ErrInvalidPrivateKey:密钥类型错误或格式不支持

PEM 格式示例:

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIB...
-----END PRIVATE KEY-----

注意事项:

  • 私钥必须严格保密,泄露将导致安全风险
  • 生产环境建议使用密钥管理服务(KMS)
  • 密钥应使用强密码保护

func (*RSADecrypter) Decrypt

func (d *RSADecrypter) Decrypt(encryptedData []byte) ([]byte, error)

Decrypt 使用 RSA 私钥解密数据

解密算法:RSA-OAEP with SHA-256 填充方案:OAEP(Optimal Asymmetric Encryption Padding) 哈希函数:SHA-256

参数:

encryptedData - RSA 加密的密文字节数组

返回值:

[]byte - 解密后的明文
error - 解密失败时返回错误

常见错误:

  • "加密数据为空":输入数据长度为0
  • "RSA解密失败":密钥不匹配、数据损坏、填充验证失败

性能考虑:

  • RSA 解密是 CPU 密集型操作
  • 2048位密钥的解密耗时约 1-2ms
  • 不适合频繁解密或大数据解密

安全注意:

  • 确保密文来源可信,防止选择密文攻击
  • 失败时不要泄露具体错误信息给用户

type RSAEncrypter

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

RSAEncrypter 实现基于OAEP填充的RSA加密 使用SHA-256作为哈希函数

func NewRSAEncrypter

func NewRSAEncrypter(pubKey []byte) (*RSAEncrypter, error)

NewRSAEncrypter 创建一个新的RSA加密器实例 参数: pubKey - PEM格式的公钥字节数组(PKIX格式) 返回: RSA加密器实例和可能的错误

func (*RSAEncrypter) Encrypt

func (e *RSAEncrypter) Encrypt(originData []byte) ([]byte, error)

Encrypt 使用RSA-OAEP和SHA-256哈希函数加密数据 参数: originData - 待加密的明文 返回: 加密后的密文和可能的错误

type TopN

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

TopN 维护前N个最大(或最小)元素 基于比较器保持元素有序,自动丢弃不符合条件的元素 泛型实现,可用于任何类型

func NewTopN

func NewTopN[T any](n int, comparer func(a, b T) int) *TopN[T]

NewTopN 创建一个新的TopN实例 参数:

n - 要维护的最大元素数量
comparer - 比较函数,如果a<b返回负数,a==b返回0,a>b返回正数

返回: TopN实例指针

func (*TopN[T]) Get

func (t *TopN[T]) Get(i int) (T, bool)

Get 获取指定索引处的元素 参数: i - 元素索引(从0开始) 返回: 元素值和是否成功的布尔值

func (*TopN[T]) GetAll

func (t *TopN[T]) GetAll() []T

GetAll 返回当前存储的所有元素的副本 返回的切片是新副本,修改不会影响TopN集合

func (*TopN[T]) Put

func (t *TopN[T]) Put(item T)

Put 将新元素插入TopN集合 元素将插入到正确的有序位置 如果集合已满且新元素不符合条件,将被丢弃

func (*TopN[T]) Range

func (t *TopN[T]) Range(f func(i int, item T) (abort bool))

Range 按顺序遍历所有元素 对每个元素调用函数f,传入索引和值 如果f返回true,立即停止迭代

func (*TopN[T]) Size

func (t *TopN[T]) Size() int

Size 返回TopN中当前存储的元素数量 大小最多为n,但如果添加的元素较少可能会更小

Directories

Path Synopsis
sockets
Package sockets provides helper functions to create and configure Unix or TCP sockets.
Package sockets provides helper functions to create and configure Unix or TCP sockets.

Jump to

Keyboard shortcuts

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