context.Context 最常见的误用,是把它当成全局参数袋。请求 ID、租户 ID 可以放进去,但数据库连接、业务配置、可选参数不应该塞进去。

我通常遵守两个规则:第一,跨 API 边界且和请求生命周期绑定的值可以放;第二,业务核心参数必须显式出现在函数签名里。

ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
defer cancel()

order, err := svc.Create(ctx, userID, req.Items)

超时要在入口附近设置,因为只有入口知道 SLA。仓储层可以尊重 ctx,但不应该偷偷创建更长的超时。

这样做的好处是排障简单:请求取消、数据库超时、下游慢查询都会沿着同一个 ctx 传播,不会出现后台 goroutine 继续跑的隐患。

分类: Go 语言笔记 标签: Go context 超时控制

评论

-- 评论已关闭 --

全部评论