今天阅读go部分源码的时候发现了一个包sync.Once
那么这个包来干什么的呢?通过百度和查看源码得知sync.Once可以控制函数只能被调用一次。不能多次重复调用。
1 var confOnce sync.Once 2 confOnce.Do(func() { 3 log.Println("test") 4 }) 5 confOnce.Do(func() { 6 log.Println("test123") 7 })
输出结果
2018/05/28 16:37:38 test 并不会打印test123
1type Once struct { 2 m Mutex 3 done uint32 4}
内部有一个锁跟一个计数列。
1func (o *Once) Do(f func()) { 2 if atomic.LoadUint32(&o.done) == 1 { //如果o.done ==1 那么就什么也不执行 3 return 4 } 5 // Slow-path. 6 o.m.Lock() //上锁 7 defer o.m.Unlock() 8 if o.done == 0 { // 不为1 则执行 9 defer atomic.StoreUint32(&o.done, 1) //+1 10 f() //执行函数 11 } 12}
具体实现用途暂时没想到不过看go源码中是用来初始化配置文件的