如何使用go编程语言实现Singleton设计模式?
撇开是否实现单例模式的观点不谈,以下是一个可能的实现:
package singleton type single struct { O interface{}; } var instantiated *single = nil func New() *single { if instantiated == nil { instantiated = new(single); } return instantiated; }
single并且instantiated是私人的,但是New()公开的。因此,你不能直接实例single没有经历New(),和它跟踪实例的数量与私人布尔instantiated。调整single口味的定义。
single
instantiated
New()
但是,正如其他几个人指出的那样,这不是线程安全的,除非您仅在中初始化单例init()。更好的方法是利用sync.Once您的辛勤工作:
init()
sync.Once
package singleton import "sync" type single struct { O interface{}; } var instantiated *single var once sync.Once func New() *single { once.Do(func() { instantiated = &single{} }) return instantiated }
另请参见,hasan j的建议只是将包 视为 单例。最后,请考虑其他人的建议:单例通常是存在问题的指示。