Go语言技术文章
-
Go 1.20 的 errors.Join 可以同时保留主流程错误和多个资源清理错误,自动忽略 nil,并让 errors.Is、errors.As 继续遍历全部子错误。本文给出 defer 与集中清理两种实用写法。240 收藏 -
Go Header 的值是字符串切片:Set 会替换旧值,Add 会追加新值。本文从键名规范化、单值与多值字段、重复写入来源和 Values 检查四个角度说明如何选择方法并排查重复字段。240 收藏 -
Go slog 批量 Handler 的关键不是简单加 channel,而是同时保留 WithAttrs/WithGroup 语义、建立事件快照、处理背压与异步错误。本文给出可扩展的批量提交骨架和关闭策略。240 收藏 -
Go testing.T.Cleanup 回调 panic 不会被静默忽略。本文说明清理时机、后进先出顺序、测试主体 panic 与 cleanup panic 的区别,并给出用 t.Errorf、局部 recover 和 go test 排查重复清理与并发边界的写法。239 收藏 -
Go 自定义错误可实现 Is(error) bool,将多个动态错误码映射为稳定错误族。本文用可重试与资源不存在示例说明浅比较、错误包装和表驱动测试。239 收藏 -
介绍 Go cmp.Or 如何按从左到右的顺序返回第一个非零候选值,并通过配置覆盖示例说明零值语义、comparable 类型约束与不适用边界。239 收藏 -
io.Copy 不一定走缓冲循环:它会优先调用 WriterTo 或 ReaderFrom。本文用调用顺序、CopyBuffer 边界和适配器示例说明自定义缓冲区为什么没有生效,以及如何正确控制这条路径。239 收藏 -
解释 Go io.Pipe 的 CloseWithError 为什么保留首个错误,梳理读写两端传播方向、nil 语义和安全关闭模式。238 收藏 -
Go h2c 失败时,先区分明文 HTTP/2 升级、先验连接、代理转发和服务端协议配置,再按状态码与请求头定位问题。本文给出 Go 1.27+ 原生配置、旧版本兼容方式和上线前检查清单。238 收藏 -
go vet 的 printf 分析器会识别自定义格式化包装器。本文用纯文本与格式化入口拆分方案解释非固定格式串告警,给出签名修正、调用迁移和边界判断。238 收藏 -
围绕 Go 1.27 泛型方法说明接收者参数、方法参数和类型约束的关系,结合 List[T].Map[R] 讲清类型推断、显式实例化、方法表达式与接口边界。238 收藏 -
testing/quick 默认通过反射生成输入,遇到含不可导出字段的结构体就无法自动构造。本文用自定义 Generator 和 Config.Values 两条路径处理本地类型与 time.Time 等外部类型,并说明随机边界与可复现配置。238 收藏 -
解释 Go http.Request.Clone 为什么不能让多个请求重复读取同一份 Body,并给出受限缓存、独立 Reader 和 GetBody 重试方案。237 收藏 -
Go 1.23 起,maps.Collect 可以把 iter.Seq2[K,V] 键值序列收集为新的 map。本文从 slices.All 的最小写法讲到自定义 Seq2、重复键覆盖规则,以及 maps.Collect 与 maps.Insert 的选择边界。236 收藏 -
C 位于 Go 垃圾回收器的对象图之外,不能在 cgo 调用结束后随意保存普通 Go 指针。本文从 GC 可追踪性、固定内存和嵌套指针三个不变量出发,对比同步借用、复制到 C 堆、runtime.Pinner 与 runtime/cgo.Handle,并给出代码、风险表和审计清单。236 收藏