golang 中 init() 和 sync.Once 的区别

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

  1. 使用init()函数

  2. 使用sync.Once同步包

有什么区别,哪个在线程安全方面更好?

如果init()解决了所有问题,那么它有什么sync.Once用呢?


繁花如伊
浏览 142回答 1
1回答

慕盖茨4494581

规范保证包init()函数只被调用一次并且全部从单个线程调用(并不是说它们不能启动 goroutines,但它们是线程安全的,除非你让它们成为多线程)。您使用的原因sync.Once是如果您想控制是否以及何时执行某些代码。程序包init()函数将在应用程序启动期间调用。sync.Once允许您执行诸如延迟初始化之类的事情,例如在第一次请求时创建资源(但只有一次,以防多个“第一个”请求同时进入)而不是在应用程序启动时;或者仅在实际需要时才初始化资源。
打开App,查看更多内容
随时随地看视频慕课网APP