# once用法


### 使用场景
once常常用来初始化单例资源，或者并发访问只需初始化一次的共享资源，或者在测试的时候初始化一次测试资源

### 实现
一个正确的once实现要使用一个互斥锁，这样初始化的时候如果有并发的goroutine，就会进入doSlow方法

### 2种错误
死锁

解决方案：不要在f参数中调用当前的这个once，不管是直接的还是间接的

未初始化

解决方案：可以自己实现一个类似once的并发原语，既可以以返回当前调用do方法是否正确完成，还可以在初始化失败后调用do方法再次尝试初始化，知道初始化成功才不再初始化了
