Go问答技术文章
-
Go 模块路径是包身份的一部分。本文给出保留旧入口、单一新实现、类型别名与函数包装的迁移方案,并说明如何排查双份包和正确使用 replace。347 收藏 -
go mod tidy 加入看似未使用的模块,通常是因为它会扫描测试、工具、构建标签和跨平台源码。本文用依赖路径、模块图和可回滚命令说明如何判断该模块是否应该保留。400 收藏 -
性质测试适合输入域宽、确定性强且能写出不变量的函数;示例断言更适合少量关键业务边界、精确输出和外部状态行为。本文结合 Go 原生 fuzzing,给出选择矩阵、幂等性示例、反例与混合测试清单。341 收藏 -
解释 Go Fuzz 失败输入为什么通常应保留到 testdata/fuzz,并区分真实实现缺陷、错误断言、非确定性、敏感数据和重复语料的不同处理方式。183 收藏 -
Go 模糊测试只覆盖少量路径时,先拆分种子输入边界,再检查 fuzz target 的可达性、确定性和运行指标,逐步提升语料质量。313 收藏 -
Go 测试的偶发失败不能只靠重复运行排查。本文区分测试数据种子与 go test 的 -shuffle 种子,给出局部 rand.Rand、顺序记录、CI 复现命令和诊断清单,并说明 map 迭代、并发调度与外部状态为何不能靠一个种子完全复现。195 收藏 -
Go 测试分层的关键不在测试数量,而在依赖边界:单元测试隔离进程内规则,集成测试验证真实数据库或协议适配,端到端测试确认关键业务链路闭环。本文用订单服务和 Go testing 示例给出判断表、数据清理与失败定位方法。366 收藏 -
Go 并行子测试在旧循环语义下可能让多个闭包读取同一个最终循环项;Go 1.22 已改变按轮变量语义,但 slice、map、指针和外部资源仍可能共享。本文给出兼容写法、深复制与资源隔离方法。205 收藏 -
从 WaitGroup 计数器、Add、Done 与 Wait 的关系出发,解释负数 panic、Wait 早退和批次复用的边界,并给出稳定的 Go 并发写法。351 收藏 -
sync.Map 主要适合键写入一次后高频读取,或多个 goroutine 各自操作不同键的场景;需要类型安全、同键复合更新、容量计数或一致快照时,普通 map 配合 Mutex/RWMutex 通常更清晰。本文给出判断表、封装写法和上线检查项。235 收藏 -
RWMutex 不会天然比 Mutex 快。本文用并发配置缓存说明读写锁的临界区边界、待写者阻塞新读者、不可升级降级等语义,并给出可调整读写比例的基准模板,帮助你按真实竞争场景做选择。325 收藏 -
Go 官方建议不要把 Context 保存进结构体,因为请求级取消、deadline 和值的生命周期会被对象复用混在一起。本文用按调用传递、生命周期检查和 net/http 兼容性例外说明该规则的边界。227 收藏 -
Golang · Go问答 | 2星期前 | golang · Context · 并发编程 · 超时控制 WithTimeout WithCancel Go context 取消传播 WithoutCancel
本文从停止权、时间预算和父级脱离三个维度比较 WithCancel、WithTimeout 与 WithoutCancel,解释父子取消传播、CancelFunc 回收、nil Done 风险,并给出请求后短任务的有界组合写法。202 收藏 -
Golang · Go问答 | 2星期前 | goroutine · Context · 并发编程 · 故障排查 · Go问答 · channel WaitGroup Go context ctx.Done 阻塞排查 context.Canceled
Context 取消只会关闭 Done 通道,不会自动打断 channel 收发、WaitGroup、Mutex、Sleep 或不支持 Context 的 I/O。本文按取消链、阻塞点和下游 API 三层给出排查与修复方法。144 收藏 -
Golang · Go问答 | 2星期前 | channel · golang · select · 并发编程 · 性能排查 · channel default分支 忙等 time.Ticker context取消 Go select
本文解释 Go select 的 default 分支为何会把阻塞等待变成高频轮询,并分别给出移除 default、加入 Context、使用 Ticker、封装单次非阻塞尝试及处理关闭通道的改法。465 收藏