版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengfengdiandia/article/details/82864471
go 的单例模式写法比较简单,可以通过sync.Once
来辅助。
type Singleton struct {
name string
}
var (
once sync.Once
instance *Singleton
)
func New() *Singleton {
once.Do(func() { // once.Do 调用的函数只执行 1 次
instance = &Singleton{name: "Tom"}
})
return instance
}
测试代码:
func TestNew(t *testing.T) {
instance := New()
instance2 := New()
if instance != instance2 {
t.Errorf("Get %p, Expect %p", instance2, instance)
}
}
我们来看看 once.Do
都做了什么
type Once struct {
m Mutex
done uint32
}
func (o *Once) Do(f func()) {
if atomic.LoadUint32(&o.done) == 1 {
return
}
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
可以看到只有在 done
等于 0
的时候才调用 f()
,一旦调用后 done 的值被置为 1
。