一、Once是什么?
Once是指只执行一个动作的对象。
Once可以用来实现单例模式、配置等功能。
二、Once 结构体
type Once struct {
done uint32 // done表示该操作是否已执行
m Mutex
}
三、Once 操作
1.Do - 执行操作
func (o *Once) Do(f func()) {
//通过done值,判断f是否执行
if atomic.LoadUint32(&o.done) == 0 {
// Outlined slow-path to allow inlining of the fast-path.
o.doSlow(f)
}
}
func (o *Once) doSlow(f func()) {
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
Once很简单,原理就是通过计数器(done)和Mutex来完成一个只执行一次的功能;
通过Once的学习,我们可以做一些类似的功能,比如只能执行N次的功能,保护某些数据等。