可以复制context.Context变量并在golang中以各种方式正常运行吗?

时间:2017-08-22 17:17:10

标签: go

我看到以下情况:

func foo(ctx context.Context) {
    localCtx := ctx 
    ... //do stuff
}

这两个context.Context变量是否可以在所有方面互换使用?

查看源代码,我看到返回的context.ContextWithCancelWithDeadlineWithTimeout返回的WithValue变量由指针内部实现结构,这将使我认为是的,如果父上下文来自这些函数之一,它们可以互换使用。但是,emptyCtx返回的context.Background()在内部是一个int,所以在这里我想,如果父上下文是背景上下文,它们可能无法在内部使用。

但是context.Context实际上是一个界面,我不确定是否/如何改变事情。

2 个答案:

答案 0 :(得分:4)

是的,您可以互换使用它们。

正如您已经注意到的,context等返回的WithCancel变量实际上是指针,因此localCtxctx都指向同一个东西。

关于emptyCtx作为int,它不应该改变因为它也被用作指针。

您提到的background变量实际上是指向emptyCtx的指针,因为它是使用new关键字初始化的:

background = new(emptyCtx)

答案 1 :(得分:0)

context.Context是一个界面。它的大小是两个指针。复制最多16个字节并不可怕