sync.Once

今天阅读go部分源码的时候发现了一个包sync.Once

那么这个包来干什么的呢?通过百度和查看源码得知sync.Once可以控制函数只能被调用一次。不能多次重复调用。

	var confOnce sync.Once
	confOnce.Do(func() {
		log.Println("test")
	})
	confOnce.Do(func() {
		log.Println("test123")
	})

输出结果

2018/05/28 16:37:38 test 并不会打印test123

type Once struct {
	m    Mutex
	done uint32
}

内部有一个锁跟一个计数列。

func (o *Once) Do(f func()) {
	if atomic.LoadUint32(&o.done) == 1 { //如果o.done ==1 那么就什么也不执行
		return
	}
	// Slow-path.
	o.m.Lock() //上锁 
	defer o.m.Unlock()
	if o.done == 0 { // 不为1 则执行
		defer atomic.StoreUint32(&o.done, 1) //+1
		f() //执行函数
	}
}

具体实现用途暂时没想到不过看go源码中是用来初始化配置文件的

猜你喜欢

转载自my.oschina.net/u/1766862/blog/1820035