写 Go 的时候,很多开发者天天都在和 context.Context 打交道。这玩意儿本来是设计用来传取消信号和控制超时的,但实际开发里,很多人喜欢把 context.Value 当成『全局垃圾桶』,啥东西都往里塞:DB 连接、各种 Config、甚至业务控制参数。这不仅让 API 接口变得很不透明,还在运行时埋了一堆类型安全的坑。这篇文章就来聊聊 context.Value 怎么用才不会翻车。
最典型的反面教材,就是把 *gorm.DB 这种数据库连接,或者全局 Config 直接通过 Context 往下传:
func SaveUser(ctx context.Context, u *User) error {
db := ctx.Value("db").(*gorm.DB) // 从上下文中读取连接
return db.Create(u).Error
}