-
Go html/template 使用自定义函数时,FuncMap 必须在 Parse 或 ParseFiles 前注册,否则模板会在解析阶段报 function 未定义。本文用一个邮件通知模板的小实验,拆开注册顺序、模板错误定位、运行时参数校验和安全边界。
-
列表接口从 page 改成 cursor 时,真正容易出问题的不是 SQL,而是参数语义、错误响应和旧客户端兼容。本文用 Go net/http 设计一个可灰度迁移的游标分页接口,给出返回结构、边界校验、错误码和回归检查。
-
context.AfterFunc 适合把取消信号转换成资源清理回调,但 Stop 返回 false 时回调可能已经启动,不能把它当成完成通知。本文从旧式 done 监听迁移到 AfterFunc,拆解取消、停止、同步和测试边界。
-
Go 服务把审计日志同步写进一个文件后,吞吐上不去、磁盘抖动还会拖慢请求。本文用分片队列和批量落盘拆开写入压力,并验证顺序、重放与停机收尾。
-
sync.Map 不是普通 map 的无脑替代品。本文用热点配置缓存这个场景,比较读多写少、频繁更新和带类型断言三种路径,结合 Go 基准测试与内存占用,说明什么时候值得采用、什么时候应该继续使用 map 加 RWMutex。
-
Go 的流式响应不是把多次 Write 拼起来就结束了。本文从 http.ResponseController.Flush 入手,做一个可验证的 SSE 示例,解释缓冲何时真正送达、HTTP/2 与代理会带来什么差异,以及客户端断开后如何让 goroutine 和 ticker 及时收口。
-
接口增加 json.Decoder.DisallowUnknownFields 后,旧客户端多传字段会从静默兼容变成 400。本文用一个订单接口故障复盘这个变化,说明如何定位触发条件、保留严格校验的收益,并通过灰度和版本边界避免再次误伤旧请求。
-
Go 定时任务并不只是每隔几分钟调用一次函数。本文比较 time.Ticker 与 cron 调度器在固定间隔、整点触发、错过补偿、任务重叠和停机收尾上的差异,并给出按业务约束选型的最小实现。
-
Go 服务需要在不重启进程的情况下更新限流阈值、灰度开关或下游地址时,atomic.Value、RWMutex 和 channel 归属各有适用边界。本文用一个可运行的配置热加载示例比较三种方案,并给出选择规则、校验点和回滚做法。
-
Go 1.25 的 runtime/trace.FlightRecorder 用内存环形缓冲持续保留最近一小段运行时追踪,等异常延迟发生时再写出文件。本文对比传统 Start/Stop 采集方式,给出 HTTP 服务接入、触发写盘和资源边界检查。
-
Go HTTP 服务的安全响应头不能只靠网关补齐。本文从 HSTS、X-Content-Type-Options 和 Referrer-Policy 三个常用边界入手,说明如何在 net/http 中统一设置、避免错误信任代理,并用 httptest 核对线上响应。
-
把 os.DirFS 接到模板、压缩包或配置读取代码后,./config.yaml 这类看似正常的路径会被 io/fs.ValidPath 拒绝。本文用最小示例解释相对路径规则、filepath 与 path 的边界,以及迁移旧代码时如何保留用户输入语义。
-
给管理接口增加 IP 白名单时,字符串比较、IPv4 与 IPv6 混用、掩码边界都容易出错。本文使用 Go netip.ParsePrefix 和 Prefix.Contains 搭建可复用的 CIDR 白名单校验器,补齐配置检查、匹配顺序和失败回归用例。
-
部署前想确认两份配置目录到底差在哪里,可以用 Go 标准库做一个只读快照工具。本文从 io/fs 和 filepath.WalkDir 出发,完成隐藏文件过滤、相对路径排序、SHA-256 摘要和 JSON 差异报告,并验证退出状态与异常边界。
-
Go 1.21 引入的 clear 可以清空 map 或 slice,但两者的结果并不一样:map 保留对象并删除键值,slice 只把元素置为零值且长度容量不变。本文用缓存重建和批处理缓冲两个场景,说明 clear 的行为、引用影响、容量边界和可验证的复用写法。