-
区分 Template 普通对象、FuncMap 闭包、模板缓存及输出文件的生命周期,提供文件关闭示例,并按句柄、缓存和引用保留定位问题。
-
Go 的 os.CreateTemp 和 os.MkdirTemp 只负责创建资源,不会替调用方自动删除。本文从正常路径、错误路径和长时间运行服务三个场景说明如何用 defer 绑定清理责任,避免临时目录持续增长。
-
用 Go 的 compress/flate 读取不带 zlib 或 gzip 外层封装的原始 DEFLATE 数据,讲清 NewReader、NewReaderDict、EOF、损坏输入和流复用的边界。
-
很多人会把 io.PipeReader.CloseWithError 的方向写反:生产者异常应由 PipeWriter.CloseWithError 传给消费者,读端关闭则用 PipeReader.CloseWithError 让写端退出。本文用最小示例说明自定义错误、EOF、主动取消和首个关闭错误生效等边界。
-
httptest.NewRequest 构造的是直接交给 handler 的入站测试请求,RemoteAddr 的固定值是稳定的默认哨兵,不代表真实客户端地址。本文说明它与 target、Host、Proto、TLS 的关系,并给出覆盖字段和改用 httptest.Server 的判断方式。
-
Go context.WithCancelCause 适合把批处理中的首个取消原因沿 Context 传给调用方。本文区分 Err 与 Cause,给出批次级 worker 示例,并说明如何用稳定错误和一次派生上下文减少额外结果包装与分配。
-
Go linkname 会绕过未导出声明的封装。本文从需求、符号签名、内存布局、Go 版本、链接器、目标架构和回滚路径几个方面说明使用前必须明确的边界。
-
Go 测试辅助函数不必手动拼接父子测试名称,传入 *testing.T 后调用 t.Name() 即可获取当前测试或子测试的完整名称。本文说明表驱动测试、t.Helper 配合方式,以及名称作为诊断信息时的边界。
-
maps.Keys 返回的是可迭代的键序列,不是现成切片。本文用 Go 1.23 的 range 语法收集 map 键,说明 nil map 与空 map 的结果,并提醒 map 键的迭代顺序不能当成稳定排序。
-
Go ResponseController.Hijack 需要按调用结果判断当前 ResponseWriter 是否支持连接接管。本文区分 HTTP/1.x、HTTP/2 与包装器能力,说明 ErrNotSupported 的降级处理,以及接管后 net.Conn、缓冲读写器和 Request.Body 的责任边界。
-
runtime.KeepAlive 只保证对象在指定位置前仍然可达,不负责关闭文件描述符、连接或其他外部资源。本文从终结器提前运行的风险出发,说明 KeepAlive 的正确位置、显式 Close 的责任和资源持续占用的排查方法。
-
io.Pipe 是没有内部缓冲的同步内存管道,写端必须等读端消费数据。本文说明怎样安排并发读写、处理 EOF 与 ErrClosedPipe,并用 CloseWithError 把首个业务错误传到另一端。
-
Go 读取 ZIP 条目大小时,应优先使用 archive/zip.FileHeader.UncompressedSize64。本文说明它与旧的 UncompressedSize 字段有什么关系,为什么 ZIP64 条目必须依赖 64 位字段,以及怎样在打开内容流前把原始大小用于配额、内存和解压边界判断。
-
Go ast.ImportSpec.End 不自动包含关联的行尾注释。本文用完整解析示例区分导入项与附注释片段,解释 ParseComments、EndPos、字节偏移及源码工具中的范围选择。
-
Go encoding/binary.Decode 适合把固定布局的字节切片按 LittleEndian 或 BigEndian 解析到结构体。本文说明字段限制、返回字节数、缓冲区不足,以及 Decode、Read、Encode 的选择。