golang sync.Once 保证某个动作仅执行一次的机制
type Once struct { done atomic.Uint32 m Mutex }
sync.Once 是 Go 语言标准库 sync 包中的一个类型,用于确保某个操作(函数)只被执行一次。
这对于初始化操作非常有用,比如数据库连接的建立、日志文件的打开等,这些操作通常只需要在程序启动时执行一次。
sync.Once 只有一个公开方法 Do(f func()),这个方法接受一个无参数且无返回值的函数作为参数。
当 Do 第一次被调用时,它会执行传入的函数 f,并设置一个内部标记表示该函数已经被执行过了。
之后对 Do 的任何调用都不会再执行 f,即使是从多个 Goroutine 并发调用也是如此。
* “Once类型” (type Once struct{xxx})包含一个done原子类型和一个m互斥锁。done用于标记初始化函数是否已经执行过。
* “Do方法” 接受一个无参数的函数 f 作为输入,如果 Once 的 done 值为0(即初始化函数尚未执行),则调用 doSlow 方法执行函数 f。
* “doSlow方法” 首先加锁,确保同时只有一个协程能执行初始化函数。然后检查 done 值,如果为0,则执行函数 f,并在 defer 语句中设置 done 为1,以标记初始化函数已完成。最后解锁。
这个实现确保了即使在多协程环境下,初始化函数也只会被执行一次,并且能够处理并发调用 Do 方法的情况。
golang oncefunc.go 的 OnceFunc 和 once.go Do 的区别。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2020-06-10 [FE] JS 判断当前是否在微信浏览器中的最新代码
2020-06-10 [FE] Quasar 变通 loading 单纯使用遮罩效果的方法