-
html/template 的 Execute 返回错误时,Writer 里可能已经存在部分 HTML。本文说明执行错误与写入错误的区别,并给出用 bytes.Buffer 先渲染、成功后再提交 HTTP 响应的稳妥写法,同时说明流式输出何时只能接受部分结果。
-
Go database/sql 的 sql.NullTime 扫描 NULL 后应让 Valid=false。本文拆开 NULL、有效时间、扫描错误和对象复用四种状态,给出 QueryRow、Rows.Scan 与 Value 的正确处理方式。
-
Go database/sql 的 Result.RowsAffected 不是所有数据库驱动都支持。本文区分执行错误、可信影响行数、零行结果和驱动不支持,给出不误判、不重复执行的处理方式。
-
解释 log/slog ReplaceAttr 处理嵌套 Group 时 groups 与 a.Key 的边界,给出按完整路径脱敏的写法,并区分 Group、LogValuer、Any 和 Handler 配置范围。
-
RuneError 不能单独代表解码失败:DecodeRuneInString 返回 RuneError 且 size 为 1 时,才表示非空输入的 UTF-8 编码非法;合法的 U+FFFD 通常占 3 个字节,空字符串则返回 size 为 0。
-
Go regexp.Regexp SubexpIndex 返回命名捕获组的数字下标,不存在时返回 -1。本文拆开说明组名存在、输入匹配和本次捕获值三种状态,给出安全读取命名组的原创示例。
-
Go sync/atomic 的 atomic.Pointer 可以原子地发布配置指针,但不会替调用方完成对象字段初始化。本文从半初始化现象出发,定位提前 Store、发布后继续修改以及嵌套引用复用造成的问题,并给出不可变配置快照的修复写法。
-
解释 Go Request.Clone 对 Header、context、URL 与 Body 的复制边界,给出并发复用请求模板时的防污染写法。
-
Go 的 time.Ticker.Reset 会从新时长重新安排下一次 tick,但慢接收者、未执行到 Reset 或并发修改都会让观察结果像是旧周期仍在生效。本文用最小示例拆开这些原因,并给出单一重置入口与日志复查方式。
-
net.LookupCNAME 返回的是跟随零条或多条 CNAME 后的规范化名称。判断查询是否失败要先看 err;没有显式 CNAME 但主机能解析到地址时不一定是错误,需要上下文时使用 Resolver.LookupCNAME。
-
net.LookupTXT 返回的是 TXT 记录组成的字符串切片;单条 TXT 记录内部有多个字符串片段时,Go 会把它们拼成一个字符串。生产代码应使用带超时的 Resolver.LookupTXT,并明确保留记录边界、处理错误和限制日志内容。
-
Go netip.Addr.Next 在最大 IPv4 或 IPv6 地址之后返回零值 Addr,这是没有后继地址的正常语义。本文说明如何用 IsValid 识别边界并安全结束地址池遍历。
-
URL.Opaque 非空时不会与 Path 合并。本文用最小 Go 示例说明两类 URL 表示、普通 HTTP 路径替换写法,以及 RawPath、查询参数、请求目标和完整 URL 的区别。
-
Go 1.22 以后,ServeMux 的单段路径变量和末尾多段通配符并非一重叠就冲突。本文用请求集合解释真正的交叉模式,说明如何通过字面路径段拆开路由边界,并提醒 PathValue、尾部斜杠和旧版本兼容开关的使用边界。
-
ResponseController.Flush 返回成功只代表 Go 端把当前缓冲交给下一跳,经过反向代理后仍可能被代理继续缓存。排查时先确认 ResponseWriter 的 Flush 能力,再关闭对应接口的 proxy_buffering 或设置 X-Accel-Buffering: no,并区分直连与代理链路。