[程序员] go 源码困惑, 在 once.Do 中放标志变量,还是放操作本身。
·
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(){…