golang oncefunc.go 的 OnceFunc 和 once.go Do 的区别
sync.Once 的 Do 方法和 OnceFunc/OnceValue/OnceValues 函数的主要区别在于使用场景和灵活性:
1、直接使用Once.Do(f):
更基础、低级的 API。你需要显式声明一个 sync.Once 变量,然后在其上调用 Do(f)方法来执行函数f。
仅保证函数f执行一次,但不直接提供函数的返回值管理或处理f中可能发生的 panic 的机制。
提供给用户更多的控制权,比如你可以决定在哪里初始化 Once 变量,以及如何围绕 Do 调用编写额外的逻辑。
示例:https://github.com/farwish/go-lab/blob/master/src/sync/once.go
2、OnceFunc, OnceValue, 和 OnceValues:
高级封装,提供了更方便的 API 来处理函数的单次执行,特别是当涉及到返回值或 panic 处理时。
自动管理了 sync.Once 实例,无需用户直接操作 Once 变量。
对于有返回值的情况(如OnceValue和OnceValues),它们处理了存储和返回首次调用的结果。
特别地,它们都妥善处理了函数 fpanic 的情况,确保在并发调用时 panic 行为一致且可预测,要么首次调用时立即重新 panic,要么在后续调用时再次 panic 同样的值。
示例:https://github.com/farwish/go-lab/blob/master/src/sync/oncefunc.go
总结来说,如果你需要简单的单次执行保证,直接使用 Once.Do 就足够了。
但如果你需要更复杂的特性,如自动管理返回值或统一处理 panic,那么 OnceFunc, OnceValue, 和 OnceValues 提供了更加便捷和高级的解决方案。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2023-06-11 [GPT] Unable to negotiate with xx.xx.xx.xx port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss
2023-06-11 [GPT] ./ssh/known_hosts 是什么
2023-06-11 [GPT] jquery chosen插件选择的多个元素是逗号分隔的,怎么设置成其它分隔符号 ?
2023-06-11 [GPT] js 外部参数怎么传给 setTimeout 的匿名函数 ?
2023-06-11 [GPT] 监测输入框被 js 设置了值 ?input 输入框被设置了 value 值,但是没有触发 change 事件?
2023-06-11 [GPT] php 报错 Unsupported operand types
2020-06-11 [FE] WebStorm, ESLint: Trailing spaces not allowed