Go问答技术文章
-
用 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 收藏 -
Golang · Go问答 | 1星期前 | 并发 · 标准库 · 故障排查 · Go问答 · time.Timer · 定时器 Go time.Timer Timer.Reset Timer.Stop 并发排查
复用 Go 的 time.Timer 时,Stop 和 Reset 的行为会受到 Go 版本、定时器是否已经到期以及是否存在并发接收的影响。本文用一个超时重试场景拆开旧版本排空规则、Go 1.23 的同步定时器语义和可验证的停机边界。236 收藏 -
Go 泛型接口同时写类型集和方法时,约束的是可接受的类型与可调用的方法。本文用一个可运行的小实验拆开两层边界,解释为什么某些类型能传入、为什么调用方仍然不能调用具体类型方法,并给出检查和扩展写法。201 收藏 -
Go 的 io/fs.WalkDir 适合做跨目录扫描,但权限错误、符号链接和大目录中断都不能靠默认行为猜测。本文用一个可运行的扫描器说明 fs.ValidPath、fs.SkipDir、context.Context 与错误记录如何配合。236 收藏 -
Go 接口升级时,既要识别未知字段避免拼写错误,又要保留新字段以兼容旧客户端。本文用 Decoder、DisallowUnknownFields 和 json.RawMessage 拆开这条边界。170 收藏 -
Go SSE 连接断开后,客户端应把服务端下发的 id 保存为恢复游标,重连时通过 Last-Event-ID 请求缺口;服务端按游标补发并让消费动作具备幂等性,才能同时避免漏事件和重复处理。194 收藏 -
Go defer 会在登记语句执行时先计算普通参数,而闭包里的变量可能等到真正执行时才读取。区分调用时快照和闭包捕获,就能解释循环日志、资源释放和错误记录中的常见偏差。255 收藏 -
Golang · Go问答 | 1星期前 | 标准库 · golang · unicode · 字符串处理 · strings.Split Go strings.Fields 字符串分词 Unicode 空白 Go 空字符串
Go 里处理用户输入时,strings.Fields 会按 Unicode 空白归并连续分隔符,而 strings.Split 会保留空字段。本文用可运行示例对比两者在连续空格、空字符串、中文空白和尾部分隔符上的结果,帮助你按数据边界选择 API。456 收藏 -
Go 程序明明调用了 Write,退出后日志文件却少了最后几行,常见原因不是字符串没生成,而是 bufio.Writer 仍留在用户态缓冲区,或 Flush、Close 的错误没有被检查。本文用一个退出前丢日志的场景,拆开缓冲写入、defer 执行时机、Flush 与 Sync 的边界,并给出可复测的收尾写法。496 收藏