我看到Go语言中使用单例模式的两种方法。
- 使用
init()
函数 - 在sync包中使用
sync.Once
它们之间有什么区别?就线程安全而言哪一个更好?
如果 init()
可以解决所有问题,那么 sync.Once
用来做什么?
我看到Go语言中使用单例模式的两种方法。
init()
函数sync.Once
它们之间有什么区别?就线程安全而言哪一个更好?
如果 init()
可以解决所有问题,那么 sync.Once
用来做什么?
包的init()
函数被规范保证只会被调用一次,并且从单个线程调用(虽然它们可以启动goroutine,但是它们是线程安全的,除非你让它们多线程)。
使用sync.Once
的原因是控制代码何时执行。 包的init()
函数将在应用程序启动时调用,没有例外。 sync.Once
允许您执行诸如延迟初始化的操作,例如第一次请求时创建资源(但仅一次,以防同时进行多个“第一次”请求),而不是在应用程序启动时; 或者仅在实际需要时才初始化资源。
init()
;init()
在你可能执行的任何命令行处理之前运行。 - David Maze