当我阅读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,应避免使用。

09-06 23:43