Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 如何根据上下文适当缩短截止日期_Go - Fatal编程技术网

Go 如何根据上下文适当缩短截止日期

Go 如何根据上下文适当缩短截止日期,go,Go,我知道这不是正确使用上下文包,但我正在使用gopher lua,我无法找到更好的解决方案 我使用上下文参数调用函数(使用上下文集调用lua.NewState),并正确地取消上下文 ctx, cancel := context.WithDeadline(context.Background(), deadline) defer cancel() Foo(ctx, parameters) 但是在另一个子函数Poo中的函数Foo的内部,我需要稍微缩短最后期限。我正在使用: func Poo(l *l

我知道这不是正确使用上下文包,但我正在使用gopher lua,我无法找到更好的解决方案

我使用上下文参数调用函数(使用上下文集调用lua.NewState),并正确地取消上下文

ctx, cancel := context.WithDeadline(context.Background(), deadline)
defer cancel()
Foo(ctx, parameters)
但是在另一个子函数Poo中的函数Foo的内部,我需要稍微缩短最后期限。我正在使用:

func Poo(l *lua.LState, timeout time.Duration) {
    ctx, cancel := context.WithTimeout(l.Context(), timeout)
    l.SetContext(ctx)
}
但是,我不确定是否必须从函数Poo调用cancel函数以避免内存泄漏。在当前代码中,我放弃取消,因为父取消总是被调用并向下传播。Go vet抱怨放弃取消,但它可能没有抓住要点


我的想法是否足够好,或者我是否应该找到更好的解决方案?

Vet大喊大叫,因为它无法验证是否发生了家长取消。实际上,没有理由放弃取消,而不是简单地推迟取消。仅仅因为当前正在调用父cancel并不意味着总是这样,或者其他东西不会破坏它。推迟取消总是一个很好的做法,即使你知道它们总是会被取消,因为它实际上不会花费你任何东西,而且它可以避免调试和以后的头痛。大多数内存泄漏都是由于其他地方的更改带来了意外的副作用。我不能推迟函数Poo中的cancel,因为它会立即退出父函数Foo。我可以将取消保存到一个包变量中,稍后从外部函数调用它,或者执行一些其他事件同步,但如果没有必要,我宁愿放弃取消函数。您可以使用Timeout执行相同的操作,并从
Poo
返回取消函数,并让
Poo
的调用者延迟它。取消子上下文不会取消父上下文。取消向下传播,而不是向上传播:。如果您在Foo中取消,Poo将提前退出。如果在Poo中取消,Foo将不受影响。啊,您直接更改
l
变量中的上下文,而不是保留不同的副本。有问题的设计。