我看到以下情况:
func foo(ctx context.Context) {
localCtx := ctx
... //do stuff
}
这两个context.Context
变量是否可以在所有方面互换使用?
查看源代码,我看到返回的context.Context
,WithCancel
,WithDeadline
和WithTimeout
返回的WithValue
变量由指针内部实现结构,这将使我认为是的,如果父上下文来自这些函数之一,它们可以互换使用。但是,emptyCtx
返回的context.Background()
在内部是一个int,所以在这里我想,如果父上下文是背景上下文,它们可能无法在内部使用。
但是context.Context
实际上是一个界面,我不确定是否/如何改变事情。
答案 0 :(得分:4)
是的,您可以互换使用它们。
正如您已经注意到的,context
等返回的WithCancel
变量实际上是指针,因此localCtx
和ctx
都指向同一个东西。
关于emptyCtx
作为int
,它不应该改变因为它也被用作指针。
您提到的background
变量实际上是指向emptyCtx
的指针,因为它是使用new
关键字初始化的:
background = new(emptyCtx)
答案 1 :(得分:0)
context.Context
是一个界面。它的大小是两个指针。复制最多16个字节并不可怕