http - 如何在不派生的情况下复制上下文对象
问题描述
我想制作一个上下文对象的副本——确切地说是一个请求上下文,然后在一个单独的 go 例程中使用它。
问题是,如果我在此请求的 HTTP 处理程序完成后使用派生请求上下文context.WithCancel(reqCtx)
,不仅原始请求上下文将被取消,而且请求上下文的副本也将被取消。
我希望能够复制原始请求上下文,并且在 HTTP 处理程序完成执行后不会被原始上下文取消。
解决方案
以下是如何创建一个使用其他上下文中的值但不取消的上下文:
type valueOnlyContext struct{ context.Context }
func (valueOnlyContext) Deadline() (deadline time.Time, ok bool) { return }
func (valueOnlyContext) Done() <-chan struct{} { return nil }
func (valueOnlyContext) Err() error { return nil }
像这样使用它:
ctx := valueOnlyContext{reqCtx}
使用没有取消的值可能超出了上下文包的设计意图。如果包的设计者认为这是一件好事,我会期望他们将上述内容捆绑在一个上下文包函数中。
推荐阅读
- python - 具有相应真实掩码的操纵图像
- html - Navbar Dropdown 扩展 Nav 而不是悬停在
- python - 如何更改按钮内文本的大小?
- excel - 陷入无限循环
- python - Tensorflow 2子类模型回溯错误
- swift - 尝试从 Firebase 字段值中设置几个变量...异步函数问题
- python - 查找关于 Python 包的 Kwargs 和其他信息
- javascript - Javascript - CreateStore - 仅将多个函数作为一个参数传递 - Redux - React Native
- java - 当来自 2 个不同类的两种方法使用 Scanner 对象时,如何关闭 Scanner?
- html - 添加 HREF 时,Div 不对齐