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源码中是用来初始化配置文件的

转载于:https://my.oschina.net/u/1766862/blog/1820035

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值