var once sync.Once

func GetInstance() *Tool {

    once.Do(func() {

        instance =new(Tool)

    })

    return instance

}

sync.Once内部本质上也是双重检查的方式,但在写法上会比自己写双重检查更简洁,以下是Once的源码

func (o *Once) Do(f func()) {

//判断是否执行过该方法,如果执行过则不执行

ifatomic.LoadUint32(&o.done) ==1 {

        return    }

    // Slow-path.o.m.Lock()    defer o.m.Unlock()

//进行加锁,再做一次判断,如果没有执行,则进行标志已经扫行并调用该方法

ifo.done ==0 {

        defer atomic.StoreUint32(&o.done,1)

        f()

    }

}