英文:
How does cancelCtx initialize its done property?
问题
有人知道Go语言中的上下文背景是如何工作的吗?
我看到通过调用WithCancel函数,会调用newCancelCtx
函数。
func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {
if parent == nil {
panic("cannot create context from nil parent")
}
c := newCancelCtx(parent)
propagateCancel(parent, &c)
return &c, func() { c.cancel(true, Canceled) }
}
// newCancelCtx返回一个初始化的cancelCtx。
func newCancelCtx(parent Context) cancelCtx {
return cancelCtx{Context: parent}
}
在newCancelCtx
函数中,cancelCtx结构体被初始化并返回。
在cancelCtx结构体中,done
属性只是一个atomic.Value类型的实例。
但是在调用cancel函数的阶段,done
属性被转换为chan struct{}
类型。
所以我的问题是,cancelCtx中的done属性是如何从atomic.Value转换为chan struct{}
的?
英文:
Does anybody knows how does context underlying works in Go?
I see that by calling WithCancel, new CancelCtx
will be called
func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {
if parent == nil {
panic("cannot create context from nil parent")
}
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}
}
And in the newCancelCtx, cancelCtx construct is initialized and returned.
In the cancelCtx, the done property is just an instance from type of atomic.Value.
But at the stage of calling the cancel, done properly is turned into the chan struct{}
So my question is how is done property in cancelCtx converted from atomic.Value to chan struct{}?
答案1
得分: 2
ctx.done
在atomic.Value
中保存了一个chan struct{}
。
在你提供的代码中,你可以看到上下文代码是如何提取通道的:
d, _ := c.done.Load().(chan struct{})
c.done.Load()
检索存储在atomic.Value
中的值(如果有的话),然后将其类型断言为chan struct{}
。
英文:
ctx.done
holds a chan struct{}
in the atomic.Value
.
In the code you included a picture of, you can see how the context code extracts the channel:
d, _ := c.done.Load().(chan struct{})
c.done.Load()
retrieves the value (if any) stored in the atomic.Value
(which has any
type), and then type-asserts it to chan struct{}
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论