V2EX 11小时前
[程序员] go 源码困惑, 在 once.Do 中放标志变量,还是放操作本身。
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入解析了Go语言context包中的AfterFunc函数,探讨了为何在取消操作中不直接使用匿名函数,而是使用局部标志变量的原因。

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)}), 这样也能确保这个取消操作只执行一次啊, 为什么要维护一个局部的标志变量呢。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Go源码 context包 AfterFunc
相关文章