如何在不派生的情况下复制 Context 对象

Mr.*_*cky 12 copy http go cancellation

我想制作一个上下文对象的副本——准确地说是一个请求上下文,然后在单独的 go 例程中使用它。

问题是,如果我在context.WithCancel(reqCtx)此请求的 HTTP 处理程序完成后使用派生请求上下文,不仅原始请求上下文将被取消,而且请求上下文的副本也将被取消。

我希望能够复制原始请求上下文,并且在 HTTP 处理程序完成执行后不会被原始上下文取消。

I L*_*ion 9

以下是如何创建一个使用其他上下文中的值但不取消的上下文:

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 }
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

 ctx := valueOnlyContext{reqCtx}
Run Code Online (Sandbox Code Playgroud)

使用不取消的值可能超出了上下文包的设计意图。如果包的设计者认为这是一件好事,我会期望他们将上述内容捆绑在上下文包功能中。