func AfterFunc(ctx Context, f func()) (stop func() bool) {
a := &afterFuncCtx{
f: f,
}
a.cancelCtx.propagateCancel(ctx, a)
return func() bool {
stopped := false
a.once.Do(func() {
stopped = true
})
if stopped { // TODO: 这个代码我很费解, 为什么不把 a.cancel(true, Canceled, nil)操作直接放到 once.Do 中呢。
a.cancel(true, Canceled, nil)
}
return stopped
}
}
这个是 go 源码中 context 包的部分代码。我很奇怪,为什么不在匿名函数中直接调用 a.once.Do(func(){ a.cancel(true, Canceled,nil)}), 这样也能确保这个取消操作只执行一次啊, 为什么要维护一个局部的标志变量呢。