init()和sync之间的区别。一旦进入golang

时间:2018-08-21 16:38:44

标签: go

我看到了两种在golang中使用单例模式的方法。

  1. 使用init()函数
  2. 使用同步。一旦同步包

有什么区别?

还要考虑线程安全的最佳方法是什么?

如果init()解决了所有问题,那么同步是什么。

1 个答案:

答案 0 :(得分:5)

规范保证包init()函数只能被调用一次,并且只能从单个线程调用所有函数(并不是说它们无法启动goroutine,但是除非您使它们成为多线程,否则它们是线程安全的)线程)。

使用sync.Once的原因是,如果您想控制是否以及何时执行某些代码。程序包init()将在应用程序启动时调用。 sync.Once允许您执行延迟初始化之类的操作,例如在第一次请求资源时创建资源(但如果一次出现多个“第一个”请求,则仅创建一次),而不是在应用程序启动时创建资源;或仅在实际需要时才初始化资源。