-
Go 模块下载并不只是从代理拿一个 zip。本文从一次依赖校验异常出发,拆开 GOPROXY、go.sum、GOSUMDB、GOPRIVATE 的信任边界,给出公有依赖校验、私有模块配置和替换后复核的实战检查清单。
-
Go 1.24 引入 os.Root 后,处理用户可控文件名不必再手写一套容易漏掉符号链接和 .. 的路径校验。本文用一个安全文件读取小实验,验证 OpenRoot、Root.Open、OpenInRoot 的边界,并说明旧版本的兼容做法。
-
Go 泛型函数接收 map 的 key 时,comparable 约束看似简单,却会牵涉接口值、切片、map 和运行时 panic 边界。本文用可编译示例拆解约束选择,并给出从 any 迁移到类型参数的检查清单。
-
Go 服务如果允许按参数访问远端 URL,真正的风险不只在字符串校验:DNS 解析后的地址、IPv4-mapped IPv6、重定向目标和代理配置都可能改变出站边界。本文用 net/url、netip 和 net/http 写一套可复查的 SSRF 防护骨架,并说明哪些判断必须在连接前和每次重定向时重复。
-
Go 1.21 引入的 log/slog 适合结构化日志,但 password、token 和手机号不能直接写入生产日志。本文从一个小型订单服务出发,用 ReplaceAttr 处理嵌套组字段,接入 JSONHandler,并用 bytes.Buffer 验证脱敏结果。
-
Go 1.21 引入的 slices.Sort、slices.SortFunc 和 slices.SortStableFunc 写法很像,但比较器语义、等值元素顺序和适用场景并不相同。本文用订单列表排序示例拆开三者的选择边界,并给出可复查的测试写法。
-
用 Go html/template 处理用户可控 href 时,单靠 HTML 转义并不够。本文从协议注入风险出发,演示安全 URL 过滤、模板上下文转义与表格驱动回归测试。
-
Go database/sql 查询循环结束并不等于读取完整成功,本文从连接中断、Rows.Close 和事务提交三个现场拆开 Rows.Err 的检查边界,并给出可复现的代码与验收方法。
-
Go 1.25 开始,Linux 容器中的默认 GOMAXPROCS 会参考 cgroup CPU 限额,并在限额变化时自动更新。本文用最小示例说明旧代码的风险、GODEBUG 兼容开关、runtime.SetDefaultGOMAXPROCS 和上线前检查。
-
Go 标准库 encoding/csv 默认会用首条记录推断字段数,遇到不齐列或引号不规范的文件就可能在中途报错。本文用导入小工具拆开 FieldsPerRecord、LazyQuotes、ParseError 和逐行处理边界。
-
strings.Fields 适合按空白切分普通文本,却不能把带引号的命令参数当成一个整体。本文从文件名带空格的真实输入出发,比较 Fields、简单状态机和标准库参数解析的边界,并用表驱动测试固定转义行为。
-
Go 服务写 Cookie 时,HttpOnly、SameSite 和 Secure 不是勾选项,而是分别对应脚本读取、跨站发送和传输加密边界。本文用 net/http 的最小写法说明属性组合、反向代理信任条件和可复查的安全检查。
-
Go 的 sync 一次性初始化器适合把稳定结果封装成函数,但初始化失败也会被缓存。本文用配置加载和重试边界说明一次性函数、OnceFunc 与可重试初始化该怎么选。
-
Go sync.Pool 适合复用短生命周期、可丢弃的临时对象,但 Put 时机和数据残留很容易写错。本文用 HTTP 响应缓冲区小实验说明 Get、Reset、Put 的边界,再用基准测试验证复用是否真的值得。
-
Go log/slog 不只是把日志改成 JSON:请求 ID、用户字段和模块信息应该在哪一层注入,决定了日志能否检索以及每条记录的成本。本文从 HTTP 请求链路拆开 With、分组属性、动态字段和高并发场景的取舍。