Go 并发利器:singleflight 如何防止缓存击穿
在高并发系统里,缓存一旦失效,热点请求会同时打到数据库,典型后果就是缓存击穿。本文围绕 Go 的 singleflight 展开,说明它如何用“同 key 请求合并”减少重复查询,并结合示例、方法说明与使用边界,帮助你判断它适不适合放进现有缓存链路。
在高并发系统里,缓存一旦失效,热点请求会同时打到数据库,典型后果就是缓存击穿。本文围绕 Go 的 singleflight 展开,说明它如何用“同 key 请求合并”减少重复查询,并结合示例、方法说明与使用边界,帮助你判断它适不适合放进现有缓存链路。

Go 的 os/exec 包看起来上手简单,但一到输出捕获、超时控制、管道串联和安全处理,很多代码就容易变得粗糙。本文按实际使用场景梳理常见调用方式、Cmd 配置重点和避坑原则,帮助你判断什么时候该用 Output、Run、Start/Wait,以及怎样把外部命令调用写得更稳。

Go 字符串当然能比较,但“能用”和“用对”不是一回事。本文从运算符、`strings.Compare()`、`strings.EqualFold()` 三种常见写法出发,解释 Go 按字节进行字典序比较的规则、性能上的快速路径,以及编码和空字符串这两个最容易踩坑的地方。

Go 里“空指针赋给接口后却不等于 nil”是个很常见的坑,尤其容易出现在 error 返回值上。关键不在指针本身,而在接口内部同时保存“类型”和“值”:只有两者都为 nil,接口才真正等于 nil。 Go 里“空指针”和“空接口”看起来都像空值,但一旦和接口实现细节碰到一起,判断结果就可能和直觉完全相反。

Go 服务上线后,真正的问题往往不是“怎么后台跑起来”,而是进程崩了谁来拉起、日志怎么看、更新怎么做。本文按单机、跨平台、容器化和微服务几类场景梳理 Systemd、Supervisor、Docker、PM2、Kubernetes 的定位与取舍。 本地能跑通的 Go 服务,一到服务器上就会暴露出另一个问题:进程挂了谁来拉起,日志去哪看,更新能不能平滑完成。

Go 开发里最耗时间的往往不是写代码,而是改一行就中断进程、重新编译、再等服务起来。本文梳理 Air、Reflex、CompileDaemon、Fresh 和 Realize 的定位、优缺点与适用场景,帮助你按项目规模、维护状态和配置复杂度选出更顺手的热更新工具。

这篇文章把一套常见的 Go 后端技术栈按“项目里到底要解决什么问题”重新拆开,覆盖配置、CLI、Web、数据库、测试、日志和代码质量七个环节。每一部分都保留原文提到的工具特性、替代方案与关键代码,方便你按项目规模、部署方式和团队习惯判断该怎么组合。

spf13/cast 是 Go 里处理“外部数据类型不确定”问题的一把常用工具。它用统一 API 覆盖字符串、数字、布尔值、切片、时间等转换场景,并在失败时返回零值或错误,适合配置读取、JSON 解析和参数处理。

Go 里的 Must 函数本质上是把“本不该失败”的错误直接升级为 panic。它能让初始化代码更短、意图更明确,但边界很重要:适合启动阶段、配置和模板这类致命依赖,不适合可恢复的业务流程。

Go 团队在没有专职 DBA 的情况下,最容易把数据库结构改动做成“口头同步”:本地改了、测试漏了、线上再出错。Goose 的价值就在于把每次表结构调整写成可执行、可回滚、可追踪的迁移文件,让数据库变更和代码版本一起管理。

很多 Go 开发者熟悉构建、运行和测试命令,却很少系统使用 `go clean`。这篇文章把它拆成编译产物、构建缓存、测试缓存和模块缓存四类场景,说明各自会删什么、什么时候该用,以及哪些组合命令适合排查构建异常与释放磁盘空间。

在 Go 并发场景里,`errgroup` 常被用来把多项互不依赖的任务统一收口。它不仅能等待多个 goroutine 完成,还能处理首个错误返回、并发数限制,以及配合 `context` 做取消控制,适合接口聚合、批量请求和资源受限的任务编排。
