当我阅读context
包源代码时,我发现Context
结构中有一个cancelCtx
接口字段。在newCancelCtx
方法中,它将parent
参数分配给cancelCtx.Context
。
我感到困惑的是,这种分配是软拷贝还是深拷贝?
结构Context
中的cancelCtx
字段是否包含指向parent
接口的指针?
// Canceling this context releases resources associated with it, so code should
// call cancel as soon as the operations running in this Context complete.
func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {
c := newCancelCtx(parent)
propagateCancel(parent, &c)
return &c, func() { c.cancel(true, Canceled) }
}
// newCancelCtx returns an initialized cancelCtx.
func newCancelCtx(parent Context) cancelCtx {
return cancelCtx{Context: parent}
}
最佳答案
接口包含指向基础数据项和类型的指针。在为接口分配值时,将分配两个值:指向该值的指针(或指向该值的副本的指针)和类型。因此,它不是深度复制。
您测试的代码在第一种情况下打印a
,在第二种情况下打印b.impl
,我猜这就是为什么输出看起来令人困惑的原因。对于第二种情况,请打印b
,应避免使用。