在这个例子中,我们将克隆HTTP请求上下文及其所有的上下文键/值对。然而,重要的一点是,我们将放弃取消或最后期限的传播。原因是,当响应被返回或上下文因任何原因被取消时,我们不希望我们的上下文被终止并过早地破坏我们的应用程序。
这里有两个选项。第一个是你在一个全新的上下文上手动设置所有的键/值对,并忽略HTTP请求上下文。然而,如果你不知道key/value,那么这就没有用了。第二种选择是我们上面所描述的,所以我们要分离并克隆现有的HTTP请求上下文。
有一点你需要注意的是。如果HTTP请求上下文与你需要上下文的后台任务无关,只需创建一个全新的上下文。不要克隆HTTP请求上下文。
我们的例子很简单。我们将有两个中间件,我们在HTTP请求上下文中设置一些键/值对。我们还将在其上添加超时/截止日期。然后我们将打印出原始和分离/克隆的上下文的样子。
结构
├── context
文件
detached.go
package context
one.go
不要像我下面做的那样设置上下文的键/值。正确使用上下文键。
package middleware
two.go
不要像我在下面做的那样设置上下文键/值。正确使用上下文键。
package middleware
main.go
package main
测试
当你调用http://localhost:8181 ,终端的输出应该如下图所示。正如你所看到的,我们分离/克隆的上下文丢弃了超时/截止信息,所以它不会再被取消了。
DETACHED ---