sync.Once的作用
控制需要执行的代码在执行时候有且只执行一次,经常用在单例模式下,保证对象只生成一次。
注意:这里的执行一次并不是里面的函数,而是once对象只执行一次,即使里面的函数变了也不再执行,例如下面的案例可以看出,及时换了执行函数也只执行了一次
func main() {
for i, v := range make([]string, 5) {
once.Do(function1)
fmt.Println("function1:", v, "---", i)
}
for i := 0; i < 5; i++ {
go func() {
once.Do(function2)
fmt.Println("function2", i, "---",)
}()
}
time.Sleep(2 * time.Second)
}
func function1() {
fmt.Println("exec function1")
}
func function2() {
fmt.Println("exec function2")
}

内部原理
通过看源码,知道内部通过互斥锁实现
type Once struct {
done uint32
m Mutex
}
func (o *Once) Do(f func()) {
if atomic.LoadUint32(&o.done) == 0 {
// Outlined slow-path to allow inlining of the fast-path.
o.doSlow(f)
}
}
if atomic.LoadUint32(&o.done) == 0 {
// Outlined slow-path to allow inlining of the fast-path.
o.doSlow(f)
}
}
网友评论