Go 语言中 time.After、Timer 和 Ticker 怎么选?

Go 里的超时与定时逻辑看似简单,真正容易出问题的往往是循环分配、Timer 重置语义和 Ticker 退出方式。本文按 Go 1.23 前后差异拆解 time.After、Timer、Ticker 与 AfterFunc 的适用边界,帮助你按场景选型并避开常见误用。 超时控制、延迟执行、定时轮询在 Go 服务中几乎无处不在,但真正容易出问题的,往往不是 API 会不会用,而是生命周期、版本语义和并发边。

Go 语言中 time.After、Timer 和 Ticker 怎么选?

Go 语言中 nil channel:用一个变量动态控制 select 分支

在 Go 并发里,把 channel 变量设为 nil 是一种很实用的 select 控制手段。它不需要额外语法,却能在同一套循环中动态启停接收、发送和多路合并分支。关键在于分清 nil、关闭 channel 与 default 忙循环的边界,才能既简化状态机,又避免死锁和空转。

Go 语言中 nil channel:用一个变量动态控制 select 分支

Go 并发测试不再靠 Sleep:testing/synctest 实践

Go 并发测试里常见的 `time.Sleep` 看似简单,实际既拖慢执行,也会把测试结果交给机器负载和调度时机。随着 Go 1.25 将 `testing/synctest` 纳入稳定标准库,开发者可以用虚拟时间和明确同步点重写超时、定时器与异步逻辑测试。

Go 并发测试不再靠 Sleep:testing/synctest 实践

面试题:Go 语言中读多写少,选 RWMutex 是万能的吗?

读多写少并不等于可以直接把互斥锁换成 `sync.RWMutex`。在高并发和多核环境下,读写锁的读路径同样要做原子写入,既可能引发缓存抖动,也会在写入到来时让新读请求排队。本文结合 Go 1.19+ 的实现细节,说明 `RWMutex` 何时有效、何时退化,以及 `atomic.Value` 在极端读多写少场景中的工程替代方案。

面试题:Go 语言中读多写少,选 RWMutex 是万能的吗?

Go 面试题:如何查询当前协程数量,以及这道题真正想考什么

在 Go 中统计当前协程数量,标准做法是调用 `runtime.NumGoroutine()`。但面试里真正想听到的,往往不只是函数名,还包括它统计的范围、与调度器的关系,以及它在协程泄漏排查中的实际用途。 面试里问“如何查询当前有多少个协程”,看起来只是一个函数调用题,真正考的却是你对 Go runtime 调度模型和并发排障思路的理解。

Go 面试题:如何查询当前协程数量,以及这道题真正想考什么

PHP 在 Linux 上如何配置优化

在 Linux 上优化 PHP,核心不是堆参数,而是先把 PHP-FPM、php.ini 和 Web 服务器三层关系理顺。本文按实际部署顺序整理常用配置项,保留可直接落地的参数和命令,并说明哪些值适合通用场景、哪些必须结合内存、并发和业务特征来调整。

PHP 在 Linux 上如何配置优化

Go 并发利器:singleflight 如何防止缓存击穿

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

Go 并发利器:singleflight 如何防止缓存击穿