问题标签 [go-context]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
http - 为什么建议使用 ctx 作为第一个参数?
正如文件所说
不要将上下文存储在结构类型中;相反,将 Context 显式传递给需要它的每个函数。Context 应该是第一个参数,通常命名为 ctx
但我发现,在典型的 http 请求句柄函数中,一个http.Request
对象的.Context()
方法可以检索与 http 请求关联的上下文。
那么为什么建议在这些函数中使用上下文作为第一个参数。在这种情况下这样做合理吗?
我知道这不是限制规则。但我不知道为什么HandlerFunc
是func(ResponseWriter, *Request)
而不是func(context.Context, ResponseWriter, *Request)
显然,HandlerFunc
打破建议。
go - 在 Go HTTP 处理程序中使用未导出的结构键获取上下文值时为 nil
任何帮助在这里表示赞赏!我确定我错过了一些非常基本的东西。
我遇到的问题是我试图在演示 Web 应用程序中获取上下文之外的值,并且收到错误消息:
2021/04/11 11:35:54 http: panic serving [::1]:60769: interface conversion: interface {} is nil, not []string
在我的主要功能中,我使用以下内容设置上下文:
然后在我的处理程序中,我有以下内容:
我知道我遗漏了一些简单的东西,因为如果我尝试上面的代码并将我的getField()
函数放在package main
一切正常的范围内。
作为参考,这是一个学习练习,我正在尝试自学 Go 路由。我确实知道有可用的路由包 - 但我的目标是学习。我正在尽力遵循Go 中 HTTP 路由的不同方法。我还通读了上下文值的陷阱以及如何在 Go 中避免或减轻它们。后者似乎直接解决了我遇到的问题,但我似乎无法根据现有的情况弄清楚如何解决它。
go - 上下文因超时而取消但计算未中止?
试图了解 go 上下文取消将如何中止后续代码的执行
实验细节:
- main func 有一个超时的上下文
2sec
- main func
sum
在单独的 go-routine 中调用另一个 func - 它1sec
为 test-run-1 和4sec
为 test-run-2休眠 - 让 main sleep
3sec
让 spun go-routine 完成执行
testcase-1 的响应:睡眠总和功能 1 秒:
testcase-2 的响应:睡眠总和功能 4 秒:
在 testcase-2 中,当 sum func 休眠 4 秒时,上下文已经在 2 秒后被超时取消,为什么它仍然在 diff go-routine 中执行 sum func 并打印print from sum fn: 1
?
来自文档:取消此上下文会释放与其关联的资源。
我的假设是所有计算将在 2 秒后立即中止,包括旋转的 go-routine
让我知道如何正确执行此操作,提前谢谢
go - golang ctx取消没有按预期工作
输出:-
正如在上面的输出中注意到的那样,我看到调用上下文的取消函数后 numof goroutines 仍然相同。您甚至可以在取消函数调用后看到 goroutine 的打印。我的期望是调用取消函数将终止传递此 ctx 的 go 例程。请帮助我了解上下文取消功能的行为。
go - 如何将上下文值从 Gin 中间件传播到 gqlgen 解析器?
我正在尝试在令牌身份验证中间件中提取 user_id 并将其传递给gqlgen的 graphql 解析器函数(以填充 GraphQL 模式的 created_by 和 updated_by 列)。身份验证部分可以正常工作。
Gin 中间件:
graphql 解析器:
在这里,我尝试使用全局变量 UID 来执行此操作,但 UID 的值没有在中间件中更新,因此,我在CreatedBy
和UpdatedBy
列中获得了“虚拟”值。我知道不鼓励使用全局变量,我对其他想法持开放态度。谢谢
go - 使用上下文跳出循环
考虑一下(https://play.golang.org/p/zvDiwul9QR0):
所以这里的上下文会在 2 秒后返回一个“Done()”通道。我想抓住这个并取消我的无限 for 循环。上面的代码示例没有这样做,它永远不会退出循环。
我怎样才能做到这一点?
go - 如何将 goroutine 包含到上下文中?
我正在开发一个需要initFunction
在单独的 goroutine 中调用启动函数 ( ) 的 Go 项目(以确保此函数不会干扰项目的其余部分)。initFunction
不得超过 30 秒,所以我想我会使用 context.WithTimeout。最后,initFunction
必须能够将错误通知给调用者,所以我想到了创建一个错误通道并从匿名函数中调用 initFunction 来接收并报告错误。
我对 Go 很陌生,所以我要求对上述代码提供反馈。
- 我对第 7 行有一些疑问。我用它来确保匿名函数被“包含”在下面
ctx
,因此被杀死和释放,一旦超时到期,一切都将结束,但我不确定我是否做了正确的事情。 - 第二件事是,我知道我应该打电话给
cancel( )
某个地方,但我无法确定在哪里。 - 最后,真的欢迎任何反馈,无论是关于效率、风格、正确性或任何其他方面。
http - 如何取消传出客户端请求的上下文?
我的代码是这样的:
它输出
这段代码是错误的。上下文将取消当我从 resp.Body 读取数据时,我如何取消上下文,在处理 http 请求期间上下文会自动取消吗?谢谢你。
go - 如何知道上下文是否已被取消?
如何知道上下文是否已被取消?
在以下示例代码中,
- 有2个任务。
- 如果这些任务中的任何一个先完成,我想通过上下文取消了解其他任务。
- 作为示例的一部分,task2 将始终首先完成(在 task1 之前)。
multithreading - 防止上下文取消在业务逻辑中间停止函数执行
有没有办法保护业务逻辑的执行免受上下文取消?这是代码片段,可以更好地理解我的问题
输出:
当执行在 for 循环中开始时,它不应该停止,直到它完成该迭代。这可以使用上下文取消吗?或者我应该使用其他方法,请建议。