Go教程技术文章
-
Go 泛型中的数值约束不只是把 int 和 float64 列出来,还要处理底层类型、~ 运算符、接口组合和类型推断。本文用一个可运行的统计函数拆解约束边界。238 收藏 -
Go 服务在数据库事务提交后发送消息、刷新缓存或调用外部接口时,最难处理的是提交成功与副作用失败之间的时间窗。本文用 Outbox 表、事务内写入、独立投递与幂等消费拆开重试边界,并给出可验证的 Go 实现与验收清单。238 收藏 -
解释 Go http.Request.Clone 为什么不能让多个请求重复读取同一份 Body,并给出受限缓存、独立 Reader 和 GetBody 重试方案。237 收藏 -
slices.Collect 能把 iter.Seq 变成切片,但空序列的结果、容量预估和重复遍历边界容易被忽略。本文用最小代码拆开收集过程,并给出选择容量策略的判断方法。236 收藏 -
Go 1.22 引入的 cmp.Or 可以从命令行、环境变量、配置文件和默认值中按顺序取首个非零值。本文用多层配置示例说明泛型约束、零值语义、布尔开关和表达式求值边界。236 收藏 -
Go strings.Builder 的 String 方法返回当前累计内容,后续 Write 是继续修改 Builder,而不是直接修改已经得到的 string。文章解释 Builder 缓冲区与字符串值的边界,并给出单一所有者、禁止复制非零 Builder、并发隔离和按需 strings.Clone 的处理方式。236 收藏 -
Go 1.23 起,maps.Collect 可以把 iter.Seq2[K,V] 键值序列收集为新的 map。本文从 slices.All 的最小写法讲到自定义 Seq2、重复键覆盖规则,以及 maps.Collect 与 maps.Insert 的选择边界。236 收藏 -
Go 泛型约束不只是列出可参与运算的类型,还能通过接口嵌入和方法集限制调用者。本文用一个可编译示例拆开类型集、方法集与指针接收者的边界。235 收藏 -
讲清 Go context.WithoutCancel 的值查询、取消与截止时间语义,并用 HTTP 请求后的有界后台任务示例说明如何搭配 WithTimeout、避免 nil Done 阻塞和正确释放资源。235 收藏 -
Go 1.23 支持对迭代器函数使用 range,并在标准库提供 iter.Seq 和 iter.Seq2。本文从调用方需求、参数语义、提前停止和兼容策略出发,说明何时返回切片,何时设计迭代器 API。234 收藏 -
bytes.Buffer 的 Grow 不是越大越好:它只保证后续写入有足够空间,Len 与 Cap 观察到的是不同维度。本文用请求拼装和最小测试说明如何估算容量、何时提前 Grow,以及如何验证扩容是否真的减少了分配。234 收藏 -
Go 的 HTTP Trailer 不在 Response.Header 中,客户端要先把 Body 读到 io.EOF,再从 Response.Trailer 读取响应体末尾的字段;服务端则要在写响应前声明 Trailer。234 收藏 -
Go 的 HTTP gzip 压缩不是给所有响应直接套一层 Writer,而是先协商 Accept-Encoding,再在首次写响应前设置 Content-Encoding 和 Vary,并正确关闭 gzip.Writer。233 收藏 -
Go 表驱动测试中,把资源创建放进 t.Run,临时目录交给 t.TempDir,其他连接和文件用 t.Cleanup 注册回收,就能隔离用例并正确处理失败、跳过和并行子测试。233 收藏 -
Go 命令行表格不要手工补空格,使用 text/tabwriter 把每列写成制表符终止的单元格,再调用 Flush 输出。本文说明 NewWriter 参数、尾部制表符、中文宽度和适用边界。233 收藏