抛开实现单例模式是否是个好主意的争论,下面是一个可能的实现:
package singleton
type single struct {
O interface{};
}
var instantiated *single = nil
func New() *single {
if instantiated == nil {
instantiated = new(single);
}
return instantiated;
}
single
and instantiated
是私人的,但是New()
是公开的。因此,您不能直接实例化single
不经过New()
,并且它使用私有布尔值跟踪实例化的数量instantiated
。调整定义single
去尝尝。
然而,正如其他几位人士所言noted http://marcio.io/2015/07/singleton-pattern-in-go/,这不是线程安全的,除非您只是在中初始化您的单例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 关于仅考虑包的建议as单身人士。最后,请考虑其他人的建议:单例通常是有问题的实现的指标。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)