Go问答技术文章
-
解释 Go 测试中 testing.TB.Cleanup 的执行时机,结合主测试、t.Run 子测试和并行测试,定位清理函数看似没有执行的常见原因。181 收藏 -
用 Go 标准库 log/slog 的 WithGroup 把请求、用户和数据库字段分组,结合 TextHandler 验证输出结构,并说明 Handler 实现与常见误区。116 收藏 -
解释带 sync.Mutex 的结构体为什么不能随意复制,比较值接收者、指针接收者和容器传参的差异,并给出可运行的验收方法。397 收藏 -
Go 代码里 errors.As 返回 false,往往不是错误没有包装,而是目标变量的类型和自定义错误的实际形态没有对上。本文用一个订单校验错误的例子,拆开值接收者、指针接收者、目标指针层级和错误链验证,帮助你快速定位匹配失败。237 收藏 -
Go 接口如果只返回一段错误字符串,调用方很难判断应该重试、提示用户还是修复参数。本文从订单查询接口的真实场景出发,设计可演进的结构化错误、参数语义、错误映射和兼容策略。413 收藏 -
Go HTTP 服务调用 Shutdown 后仍可能丢请求,关键不在一个函数是否返回,而在新连接、活跃连接、Keep-Alive 连接和超时窗口是否被分别处理。本文用一个可复现的停机流程拆开这些边界。343 收藏 -
用 Go archive/tar 读取压缩包时,先做本地路径判断,再限制输出根目录并拒绝链接条目,最后用越界和覆盖测试验收解包逻辑。341 收藏 -
context.WithValue 适合传递贯穿请求链的元数据,不适合替代函数参数或承载业务配置。本文用键类型、取值失败和测试隔离三个边界,说明什么时候该用、什么时候该拆出显式参数。107 收藏 -
Go 里两个 time.Time 看起来显示相同,直接用 == 仍可能比较出不同结果。本文从单调时钟、Location 和时间精度三个边界说明 Equal 与 == 的区别,并给出可验证的比较写法。276 收藏 -
Go 泛型函数一旦把参数收窄成 any,就会失去编译期可用的类型信息。本文从一个可复用的过滤函数出发,对比 any、类型断言和泛型约束的边界,并给出选择建议。173 收藏 -
Go 泛型代码里,值类型约束明明包含目标类型,却可能无法调用指针接收者方法。本文用类型集、方法集和可运行示例拆开这个边界,并给出约束与调用方都能验收的写法。193 收藏 -
Go 的 map 可以在 range 遍历中删除当前键,但删除未到达的键会改变本轮可见结果,新增键则可能出现也可能被跳过。本文用可运行示例拆开这三个边界,并说明并发场景为什么仍然不安全。295 收藏 -
context.WithoutCancel 会保留父 Context 的 Value,但故意切断 Done、Err、Deadline 和 Cause。本文用 Go 1.21+ 的最小示例说明适用场景、迁移边界与验收方法。344 收藏 -
复用 Go 的 time.Timer 时,Stop 和 Reset 的行为会受到 Go 版本、定时器是否已经到期以及是否存在并发接收的影响。本文用一个超时重试场景拆开旧版本排空规则、Go 1.23 的同步定时器语义和可验证的停机边界。236 收藏 -
Go 泛型接口同时写类型集和方法时,约束的是可接受的类型与可调用的方法。本文用一个可运行的小实验拆开两层边界,解释为什么某些类型能传入、为什么调用方仍然不能调用具体类型方法,并给出检查和扩展写法。201 收藏