当前位置: > > > > 关于上下文包中 Golang 嵌入接口字段分配的混乱
关于上下文包中 Golang 嵌入接口字段分配的混乱
来源:stackoverflow
2024-04-26 18:09:26
0浏览
收藏
本篇文章给大家分享《关于上下文包中 Golang 嵌入接口字段分配的混乱》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。
问题内容
当我阅读context包源代码时,我发现context结构体中有一个context接口字段。在 newcancelctx 方法中,它将 parent 参数分配给 cancelctx.context。 我很困惑这样的作业是软拷贝还是深层拷贝? struct cancelctx 中的 context 字段是否保存指向 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 ,它应该是显而易见的。
本篇关于《关于上下文包中 Golang 嵌入接口字段分配的混乱》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注米云公众号!
