Jack Lindamood How to correctly use context.Context in Go 1.7发表的这篇优秀博客文章归结为以下报价:
Context.Value应该通知,而不是控制。如果您正确使用context.Value,这是我认为应该引导的主要口头禅。该 context.Value的内容是维护者而不是用户。它永远不应该 是记录或预期结果的必要输入。
目前,我正在使用Context
传输以下信息:
RequestID
传递给Go后端,它只通过命令链,然后再次插入响应中。如果没有响应中的RequestID
,客户端就会破坏。
SessionID
标识WebSocket会话,当在异步计算(例如工作队列)中生成某些响应时,这很重要,以便识别响应应该发送到哪个WebSocket会话。
当非常认真地对待定义时,我会说两者都违反了context.Context
的意图,但是在完成整个请求时,它们的值不会改变任何行为,它只在生成响应时才有意义。
有什么替代方案?在服务器API中使用context.Context
元数据实际上有助于维护精益方法签名,因为这些数据与API无关,但对传输层非常重要,这就是为什么我不愿意创建类似请求结构的东西:
type Request struct {
RequestID string
SessionID string
}
并将其作为每个API方法的一部分,该方法仅在发送响应之前通过。
答案 0 :(得分:0)
根据我的理解,上下文应仅限于传递诸如请求或会话ID之类的内容。在我的应用程序中,我在其中一种中间件中执行以下操作。有助于观察
if next != nil {
if requestID != "" {
b := context.WithValue(r.Context(), "requestId", requestID)
r = r.WithContext(b)
}
next.ServeHTTP(w, r)
}