-
Go database/sql 不能把 SQL NULL 直接扫描到 string。本文说明 NULL、空字符串和默认文本的区别,并比较 sql.NullString、*string 与 COALESCE 的适用边界。
-
Go reflect 查到未导出字段不代表能调用 Interface 或 Set。本文区分字段存在、导出、可寻址与可修改,给出返回明确错误的读取示例及公开接口替代方案。
-
Go reflect 修改字段时 CanSet 为 false,通常是反射值不可寻址、忘记从指针 Elem,或字段未导出。本文用结构体和 map 对照示例说明安全赋值路径与排查边界。
-
Go html/template 输出和预期不同,通常不是数据丢失,而是模板根据 HTML、属性或 URL 上下文自动转义。本文用最小示例区分纯文本、可信 HTML 和不安全 URL,给出不绕过安全保护的排查与修复方法。
-
Go tar 解包应分别处理条目名与链接目标。本文采用默认拒绝链接的严格策略,用 os.Root 与私有暂存目录限制实际写入,并说明词法检查、平台差异及资源预算边界。
-
Go 先用 filepath.EvalSymlinks 检查,再调用 os.Open,仍可能因检查与使用之间的 TOCTOU 竞态打开意外文件。本文区分 IsLocal、EvalSymlinks 与目录根约束,并给出 Go 1.24+ 的 os.OpenInRoot、os.Root 迁移写法。
-
Go os.RemoveAll 删除只读目录失败时,先判断错误来自文件本身、父目录权限还是平台差异,再决定是否受限修复权限并重试。本文给出安全边界、错误分类和可复用的 Go 处理示例。
-
Go 的 os.CreateTemp 和 os.MkdirTemp 只负责创建资源,不会替调用方自动删除。本文从正常路径、错误路径和长时间运行服务三个场景说明如何用 defer 绑定清理责任,避免临时目录持续增长。
-
Go 的 os.OpenFile 传入 0666 后,新文件可能显示为 0644,原因通常是 Unix-like 系统的 umask 按位屏蔽了权限。本文结合 O_CREATE、O_TRUNC、默认 ACL 和跨平台边界说明如何排查。
-
Go WebSocket 关闭码应按所选库从读循环错误中提取。本文用 Gorilla CloseError 展示 Code 与 Text 的读取方式,说明 1005、1006、本地主动关闭和握手 HTTP 状态的区别。
-
Go 反向代理中 Host 变了,通常不是请求丢失,而是 Request.Host、URL.Host 与 ProxyRequest.SetURL 的职责不同。本文结合 ReverseProxy 的 Rewrite 写法,说明如何保留入口 Host、设置上游 Host,并排查代理链中的字段来源。
-
Go 的 ETag 条件请求总是返回 200,通常不是客户端没有缓存,而是服务端没有读取 If-None-Match、比较规则不兼容,或在写入响应体后才尝试返回 304。本文给出可直接改造的 net/http handler 和排障顺序。
-
Go HTTP Range 返回长度不对时,常见根因不是一个字段,而是区间闭端点、文件 Seek 大小、压缩解码和自定义响应头互相错位。本文按服务端、标准库和客户端三层给出判断与修复方式。
-
Go TCP 建连成功不代表业务响应完成。本文按读写阶段检查过期 deadline、缓冲刷新、协议帧和部分传输,并用独占连接示例说明交换预算与超时重试边界。
-
Go 的 tls.ConnectionState.NegotiatedProtocol 为空,不一定表示 TLS 握手失败,可能是没有配置 ALPN、对端没有启用 ALPN,或读取时机早于握手完成。本文按值班排障顺序说明 NextProtos、HandshakeComplete、协商结果和回滚边界。