我看到了两种在golang中使用单例模式的方法。
有什么区别?
还要考虑线程安全的最佳方法是什么?
如果init()解决了所有问题,那么同步是什么。
答案 0 :(得分:5)
规范保证包init()
函数只能被调用一次,并且只能从单个线程调用所有函数(并不是说它们无法启动goroutine,但是除非您使它们成为多线程,否则它们是线程安全的)线程)。
使用sync.Once
的原因是,如果您想控制是否以及何时执行某些代码。程序包init()
将在应用程序启动时调用。 sync.Once
允许您执行延迟初始化之类的操作,例如在第一次请求资源时创建资源(但如果一次出现多个“第一个”请求,则仅创建一次),而不是在应用程序启动时创建资源;或仅在实际需要时才初始化资源。