go-redislock 是一个由 jefferyjob 开发的 Go 语言库,用于在分布式环境中实现基于 Redis 的高性能分布式锁。它提供了可靠的并发控制机制,确保多个节点在访问共享资源时的数据一致性和资源互斥。 核心特性 高性能:利用 Redis 的内存存储特性,实现快速的锁获取与释放。 超时机制:支持设置锁的过期时间,防止死锁。 可重入性:允许同一线程多次获取同一把锁。 自动续期:在长时间任务执行期间,自动延长锁的有效期。 手动续期:提供手动延长锁有效期的方法,满足特定需求。 灵活的锁释放方式:支持手动释放锁,确保资源的及时释放。 安装 使用以下命令安装 go-redislock: go get -u github.com/jefferyjob/go-redislock 示例 package main import ( "context" "fmt" redislock "github.com/jefferyjob/go-redislock" "github.com/redis/go-redis/v9" ) func main() { // 创建 Redis 客户端 red.... 有更新! golang每日一库之jefferyjob/go-redislock golang每日一库
bsm/redislock 是一个用于 在 Go 语言中实现基于 Redis 的分布式锁(distributed lock) 的开源库,由 bsm 组织开发和维护。 它实现了基于 Redis 的 SET NX PX 命令模式的分布式锁,兼容 Redlock 算法的核心思想,但更简单和轻量。 简介 基于 Redis 单实例实现分布式锁 遵循 Redis 官方推荐的 SET resource-name value NX PX max-lock-time 模式 简洁、高性能、线程安全 支持锁自动过期 支持锁续约(可选) 没有依赖复杂的 Redlock 多主节点算法,更适合大多数实际应用 安装方法 go get github.com/bsm/redislock 示例 import ( "context" "fmt" "log" "time" "github.com/bsm/redislock" "github.com/redis/go-redis/v9" ) func main() { // Connect to redis. client := redis.NewClient(&r.... 有更新! golang每日一库之bsm/redislock golang每日一库
redsync 是一个用 Go 编写的分布式互斥锁(Distributed Mutex)库,基于 Redis 实现。其主要目标是在分布式系统中为多个进程或服务之间提供互斥访问的机制,确保同一时间内只有一个客户端可以访问共享资源。 GitHub 项目地址:👉 https://github.com/go-redsync/redsync 核心功能 redsync 实现了 Redlock 算法(由 Redis 创始人 antirez 提出),该算法旨在在分布式环境中实现安全、健壮的锁。 基本原理 使用多个独立的 Redis 实例。 客户端尝试依次在多数 Redis 节点上设置一个带过期时间的锁。 如果大多数实例成功设置锁,并且总耗时小于锁的过期时间,则认为加锁成功。 释放锁时,会逐个删除这些实例上的锁。 安装 go get github.com/go-redsync/redsync/v4 示例 package main import ( "github.com/go-redsync/redsync/v4" "github.com/go-redsync/redsync/v4/redis/go.... golang每日一库之redsync golang每日一库
RussellLuo/slidingwindow 是一个用 Go 语言实现的滑动窗口速率限制器,灵感来源于 Kong API 网关的限流算法。该库支持本地和分布式限流,适用于需要精确控制请求速率的场景。 设计理念 该库通过维护两个窗口(当前窗口和前一个窗口)的请求计数,估算当前时间点的请求速率,从而实现滑动窗口限流。 例如,设定每分钟最多允许 100 次请求: 当前时间为第 75 秒,即当前窗口开始于第 60 秒。 当前窗口内记录了 12 次请求。 前一个窗口(第 0 秒到第 60 秒)内记录了 86 次请求。 则当前估算的请求数为: count = 86 * ((60 - 15) / 60) + 12 = 86 * 0.75 + 12 = 76.5 如果 count 超过设定的阈值(例如 100),则拒绝新的请求。 主要组件 1. Limiter Limiter 是速率限制的核心结构,负责判断是否允许新的请求。它通过维护两个窗口的计数来估算当前的请求速率。 主要方法: Allow():判断是否允许一个新的请求。 AllowN(now time.Time, n int64):判断是否.... 有更新! golang每日一库之RussellLuo/slidingwindow golang每日一库
Intern 是一个用于 Go 语言的字符串驻留库。 它的核心思想是在程序中对重复出现的字符串只保留一份副本,从而节省内存并减少垃圾回收压力。在需要频繁处理大量相同字符串的场景下(例如解析 JSON 时大量重复的键名、日志标签、协议头字段等),使用该库可以显著降低内存占用。 需要注意的是,该库仅提供“尽力而为”(best-effort)的驻留机制,即库会尽量重用已有字符串,但驻留的字符串可能会在任何时候被回收和移除。 学习该库之前,你必须明白什么是字符串驻留,为什么需要字符串驻留,什么时候需要字符串驻留,以及实现字符串驻留的常用方法。 项目用途 Intern 库的设计目的就是简化字符串驻留的过程。 通常自己实现字符串驻留需要管理一个全局映射 (map[string]string) 并处理并发访问和生命周期,但这很容易出错。 Intern 包通过简单的 API 隐藏了这些复杂性:只需调用 intern.String(s) 或 intern.Bytes(b) 即可得到驻留后的字符串版本。文档说明该包“所有函数都支持并发调用”并且“驻留的字符串可以随时被移除”。 换言之,用户无需手动加锁或维.... golang每日一库之josharian/intern golang每日一库
do 是 Go 语言中一个轻量级的依赖注入(Dependency Injection, DI)容器,由 samber 开发。 它基于 Go 1.18+ 泛型实现,为 Go 提供了一个类型安全的 DI 方案。 do 库的设计理念是简化服务组件之间的依赖管理,取代手工创建依赖关系的繁琐工作,使不同组件之间松散耦合、更易测试与维护。 与反射型 DI 框架不同,do 在注册和解析依赖时不使用反射,因此性能开销很小。 功能简介 服务注册:使用 do.Provide 系列函数将服务构造函数注册到容器中(默认懒加载,即按需单例创建);也可以使用 ProvideTransient 注册每次调用都新建实例的工厂(瞬时模式);或使用 ProvideValue/ProvideNamedValue 注册已经创建好的实例(急加载)。注册时可指定名称或匿名服务(推荐匿名,由框架自动命名)。 依赖解析:通过 do.Invoke[T](injector) 或 do.MustInvoke[T](injector) 获取指定类型的服务实例。容器会自动根据函数签名的参数解析依赖,并以依赖图的方式按顺序实例化各服务(默认单例.... 有更新! golang每日一库之依赖注入库samber/do golang每日一库
一、库简介 go-cleanhttp 是一个专门为 Golang 开发者设计的工具库,旨在提供一组函数,用以生成配置“干净”的 HTTP 客户端(http.Client)和传输(http.Transport)。在 Golang 中,标准库自带的 http.DefaultClient 和 http.DefaultTransport 往往存在共享状态(如连接池)的隐患,尤其在并发或多库同时使用时可能出现意外的副作用。 而 go-cleanhttp 则致力于消除这些隐患,帮助开发者创建独立且配置合理的 HTTP 请求组件。 二、代码示例 废话不多说,上代码 package main import ( "fmt" "io/ioutil" "net/http" "github.com/hashicorp/go-cleanhttp" // 假设库的引入路径为该路径 ) func main() { // 使用库函数创建一个干净的 HTTP 客户端 client := cleanhttp.DefaultClient() // 发送一个 GET 请求 resp, err := client.Get("h.... 有更新! golang每日一库之go-cleanhttp golang每日一库
gconv 是一个 Go 语言的库,提供了一套高效且灵活的工具来简化不同数据类型之间的转换。 它来自于 gf(GoFrame)框架的一部分,专注于数据转换任务,特别是从 map、JSON、struct、slice、array 等常见数据类型之间进行转换。 这个库的核心优势是它通过类型断言机制使得类型转换变得非常简洁且高效,极大地减少了手动编写冗长代码的需求。 核心功能 1. 类型转换 gconv 提供了多种数据类型转换的支持,包括但不限于: 基本数据类型(如 int、float64、string)之间的转换。 结构体与 map 之间的相互转换。 结构体与 JSON 的相互转换。 切片与数组 之间的转换。 其他自定义类型 与基础类型之间的转换。 package main import ( "fmt" "github.com/gogf/gf/v2/util/gconv" ) func main() { i := 123 fmt.Printf("%10s %v\n", "Int:", gconv.Int(i)) fmt.Printf("%10s %v\n", "Int8:", gconv.I.... 有更新! golang每日一库之gconv golang每日一库
一、简介 safetext 是 Google 开源的安全增强型 Go 语言模板处理库,旨在防范 YAML 注入和 Shell 命令注入攻击。它直接替代 Go 标准库的 text/template,通过严格的输入验证机制,阻断攻击者通过模板参数发起的恶意注入行为。 二、防范漏洞 YAML 注入攻击当模板参数由攻击者控制时,若使用标准库的 text/template 处理 YAML 模板,攻击者可能通过换行符等特殊字符篡改文档结构(如覆盖敏感字段)。例如: sensitive: data innocent: "{{ .input}}" # 攻击者输入可注入换行符破坏结构 safetext 会在检测到此类注入时立即返回 YAML Injection Detected 错误,阻止恶意操作。 Shell 命令注入 在拼接 Shell 命令时,传统方法(如 fmt.Sprintf)存在参数逃逸风险。例如: result := fmt.Sprintf("git commit -m %s", message) // 若 message 含 `rm -rf /` 等命令 使用 safetext 提供.... 有更新! golang每日一库之safetext golang每日一库
作为一个 HTML 解析库,PuerkitoBio/goquery 凭借类 jQuery 的语法设计,改变了开发者处理网页数据的姿势。本文将剖析其核心特性,并通过 实用案例展示该库的用法。 一、架构解析 1.1 底层技术栈 • 基于 net/html 标准库实现 DOM 解析 • 集成 cascadia CSS 选择器引擎(支持 CSS3 选择器) • 内存友好型设计,单节点内存消耗仅 0.5KB 1.2 性能 操作类型GoQuery正则解析BeautifulSoup 解析 1MB HTML12ms45ms210ms 10k 次选择器0.8s3.2s5.6s 内存占用峰值35MB120MB280MB 二、环境配置与基础用法 2.1 安装命令 go get github.com/PuerkitoBio/goquery 2.2 文档加载方式 // 从网络加载 doc, err := goquery.NewDocumentFromReader(res.Body) // 从字符串加载 html := `<html><body>Hello</body><.... 有更新! golang每日一库之goquery golang每日一库
当我们需要进行代码更新、配置热加载或证书轮换时,如何在不中断现有连接的前提下完成服务重启? 今天我们介绍一个优雅的零停机重启库endless,仓库地址 github.com/fvbock/endless。 一、关于重启 1.1 传统重启的痛点 • 连接强制中断:标准 net/http服务器重启时会立即关闭监听套接字 • 请求丢失风险:处理中的请求可能被强制终止 • 服务发现延迟:负载均衡器的健康检查可能产生服务空窗期 1.2 endless的解决方案 • 平滑套接字交接:通过 SO_REUSEPORT实现端口复用 • 双进程协作:新旧进程并行运行直至旧连接完成 • 信号驱动:支持SIGHUP等信号触发安全重启 二、技术实现 2.1 架构设计 [旧进程] │ 接收SIGHUP信号───┤ ├─► 创建新进程(继承文件描述符) │ [新旧进程共存期]──┬─► 新连接路由到新进程 └─► 旧进程处理存量请求 2.2 关键代码 func (e *endlessServer) Serve() error { // 设置套接字复用参数 syscall.SetsockoptInt(e.List.... golang每日一库之endless golang每日一库
在大数据时代,网络爬虫已成为采集、分析数据的重要工具。作为 Golang 领域中最流行、最优雅的爬虫框架之一,Colly 不仅拥有简洁直观的 API,还具备强大的性能和灵活的扩展能力。本文将带你深入了解 Colly,从基本安装到进阶用法,再到分布式爬取和代理切换,帮助你快速上手并构建属于自己的爬虫项目。 一、简介 Colly 是由 gocolly/colly 提供的 Golang 爬虫框架。它的设计理念是“快速、优雅、灵活”,能够帮助开发者高效地实现网页抓取、数据提取以及分布式爬虫等任务。无论你是需要抓取简单页面的数据,还是构建一个复杂的异步爬虫,Colly 都能满足你的需求。 主要特点: 简洁的 API 设计:通过链式调用和事件回调,开发者可以轻松编写爬虫逻辑。 高并发支持:内置并发控制和限速功能,轻松应对高流量爬取。 自动处理 Cookie 和 Session:无需额外配置,Colly 会自动管理请求过程中的 Cookie。 灵活的扩展机制:支持代理切换、分布式爬取、数据缓存等高级功能。 支持 HTML/ XML 解析:内置 goquery,方便使用 CSS 选择器或 XPath .... 有更新! golang每日一库之Colly golang每日一库
以下是一篇关于 guonaihong/gout 的技术博客,结合其核心特性、使用场景及技术实现细节进行详细介绍: 一、Gout 简介 Gout 是由开发者 guonaihong 基于 Go 语言实现的高效、易用的 HTTP 客户端库。 其设计理念是通过链式调用和反射机制,简化 HTTP 请求的构建与响应处理。代码非常优雅。 Gout 不仅支持多种数据格式(如 JSON、XML、Protobuf 等),还内置了性能测试、重试机制、中间件扩展等高级功能,适用于 API 调用、微服务通信、数据爬取等场景。源码值得一品。 二、核心特性与实现解析 1. 链式调用与请求构建 Gout 通过链式调用语法实现请求参数的灵活设置。例如,设置 URL Query、Header 和 Body 仅需一行代码: gout.POST("http://example.com"). SetQuery(gout.H{"page": 1}). SetHeader(gout.H{"X-Token": "abc"}). SetJSON(gout.H{"name": "gout"}). Debug(true). // 开启调试.... 有更新! golang每日一库之gout golang每日一库
今天介绍一个可以跟fasthttp比肩的http库imroc/req 一、简介 imroc/req 是一个用于 Golang 的 HTTP 请求客户端库,其设计理念类似于 Python 的 Requests 库。该库提供了简单、直观的 API,使得开发者能够快速构造并发送 HTTP 请求,同时方便地处理响应数据。它适用于处理各种常见的 HTTP 请求场景,包括 GET、POST、PUT、DELETE 等,同时支持 JSON、表单数据、文件上传等多种内容类型。 二、特点 简单易用的 API 通过链式调用和简化的函数接口,极大地降低了发送 HTTP 请求的门槛,代码更加清晰易读。 丰富的数据处理能力 内置对 JSON 数据的自动编码与解码支持,能够快速将响应数据绑定到结构体或 Map 中,方便后续处理。 多种请求方式支持 支持 GET、POST、PUT、DELETE、PATCH 等常见的 HTTP 方法,可以轻松应对各类接口请求。 灵活的请求配置 可以通过设置 Header、Query 参数、Cookies 等自定义 HTTP 请求,同时支持超时、代理、重试等高级配置。 文件上传和多部分表.... golang每日一库之req golang每日一库
今天简单介绍一个消息队列库 nsqio/go-nsq 一、概述 NSQ 是一个实时分布式消息平台,旨在处理大规模、分布式系统中的消息流转。它采用去中心化的设计,并且具备高可用性和容错能力。 而 go-nsq 则是 NSQ 官方提供的 Golang 客户端库,用于实现消息的生产(Producer)与消费(Consumer)。它封装了网络连接、重试、心跳检测等底层细节,使得开发者能够专注于业务逻辑的实现。 二、主要特性 简洁易用的 API 提供了简单的接口用于发布消息和消费消息,无论是生产者还是消费者,都可以快速上手。 高性能与可扩展性 适用于处理高吞吐量的实时数据流,并且可以通过 nsqlookupd 实现节点动态发现,支持大规模分布式集群。 灵活的错误处理与重试机制 内置对消息重试、延迟投递等机制,确保在网络故障或节点异常时消息依然可靠传递。 支持 TLS 与高级配置 可以配置 TLS 加密,满足对安全通信有要求的场景,同时支持各种连接和消息处理参数的自定义配置。 与 nsqlookupd 集成 除了直接连接 NSQD 节点,go-nsq 还可以通过 nsqlookupd 动态获取可用.... golang每日一库之go-nsq golang每日一库
我今天要介绍的gmail库是一个简单易用的 Golang 邮件发送库 支持 SMTP 发送、附件、HTML 邮件、TLS 加密等功能。适用于发送通知、验证码、报告等邮件。 安装 go get gopkg.in/gomail.v2 基本用法 1. 发送简单邮件 package main import ( "gopkg.in/gomail.v2" ) func main() { m := gomail.NewMessage() m.SetHeader("From", "your-email@example.com") // 发件人 m.SetHeader("To", "recipient@example.com") // 收件人 m.SetHeader("Subject", "Hello from Go") // 主题 m.SetBody("text/plain", "This is a test email!") // 邮件正文(纯文本) d := gomail.NewDialer("smtp.example.com", 587, "your-email@example.com", ".... 有更新! golang每日一库之gomail.v2 golang每日一库
go-pinyin 汉字转拼音库 go-pinyin 是一个用于将汉字转换为拼音的 Golang 库,提供多种模式,支持带音调、无音调、首字母提取等功能。该库适用于拼音搜索、汉字排序、文本转换等场景。 安装 使用 go get 下载安装: go get -u github.com/mozillazg/go-pinyin 基本用法 package main import ( "fmt" "github.com/mozillazg/go-pinyin" ) func main() { hans := "汉字转拼音" py := pinyin.Pinyin(hans, pinyin.NewArgs()) fmt.Println(py) // 输出: [[han] [zi] [zhuan] [pin] [yin]] } 默认情况下,Pinyin 方法会返回每个汉字的拼音,采用无音调的格式。 模式选项 go-pinyin 提供了多种模式,用户可以通过 pinyin.Args 结构体参数进行配置。 1. 带音调的拼音 args := pinyin.NewArgs() args.Style = .... 有更新! golang每日一库之go-pinyin golang每日一库
今天要介绍的库 mojocn/base64Captcha 是一个用于 Go 语言的高效验证码生成库,支持图片、音频等多种验证码格式,并且可以通过 base64 编码输出,方便前端直接使用。该库广泛用于 Web 应用、REST API 以及需要身份验证的系统中,以增强安全性。 主要功能 支持多种验证码类型 数字验证码(DriverDigit):仅包含数字,适用于一般验证码场景。 字符验证码(DriverString):包含数字、大小写字母,支持自定义复杂度。 算术验证码(DriverMath):计算数学表达式(加减乘除),提高安全性。 音频验证码(DriverAudio):对视力受限的用户友好。 自定义验证码:可通过 Driver 接口扩展自定义的验证码格式。 内存存储与 Redis 存储支持 默认使用 内存存储(base64Captcha.DefaultMemStore)。 支持 Redis 作为存储后端,便于多服务器环境下共享验证码状态。 验证码 Base64 编码 生成的验证码图片或音频可直接转换为 base64 字符串,前端可以通过 img 标签或 audio 标签直接显示。 验.... golang每日一库之base64Captcha golang每日一库
shirou/gopsutil 是一个用 Go 语言实现的跨平台系统信息采集库,其设计灵感来源于 Python 的 psutil。它为开发者提供了一套统一、简洁的 API,用于获取底层操作系统的各项指标数据,如 CPU、内存、磁盘、网络、主机信息以及进程状态等。下面我们将从多个方面详细介绍这个库的功能、设计特点、使用示例以及应用场景。 1. 库简介 跨平台支持 gopsutil 封装了各操作系统(Linux、Windows、macOS、FreeBSD 等)底层调用的差异,使得开发者无需关注平台细节,就能轻松采集系统硬件和软件指标。 无 cgo 依赖 该库完全采用纯 Go 代码实现,不依赖 cgo,这使得交叉编译变得十分简单,便于在各种架构和操作系统上部署使用。 模块化设计 功能被拆分为多个子包,每个子包负责一个领域的数据采集,如 CPU、内存、磁盘、网络、进程、主机信息等,用户可按需引入相关模块,降低资源消耗和依赖复杂度。 统一接口 不同平台下返回的数据结构一致,极大地降低了跨平台开发时的适配工作量。 citeturn0search0 2. 主要功能模块 2.1 CPU 模块 基.... golang每日一库之gopsutil golang每日一库
Fiber 是一个 极其轻量级且高性能 的 Go Web 框架,受 Express.js 启发,专为 快速开发 REST API 和 Web 应用设计。Fiber 构建于 Fasthttp 之上,号称是 Go 语言最快的 Web 框架之一,提供了简洁的 API 和强大的功能,非常适合构建高吞吐量的 Web 服务。 核心特性 🚀 极致性能 采用 Fasthttp 作为底层 HTTP 服务器,性能比 net/http快 10 倍 以上。 低 CPU 和内存占用,非常适合 高并发应用。 📦 Express.js 风格 API 受 Node.js 的 Express 框架启发,提供类似 app.Get()、app.Post() 这样简洁直观的路由 API。 🔥 内置丰富功能 路由系统(带有参数、通配符、正则匹配) 中间件支持(如 CORS、JWT、Gzip、Logger) WebSocket 支持 静态文件托管 请求体解析(JSON、表单、XML 等) Session & Cookie 管理 💡 零依赖 & 兼容 net/http 轻量级,只有一个依赖 fasthttp.... golang每日一库之gofiber/fiber golang每日一库