package signal import ( "sync" "sync/atomic" ) type Once struct { m sync.Mutex done uint32 } func (o *Once) Do(f func()) { if atomic.LoadUint32(&o.done) == 1 { return } o.m.Lock() defer o.m.Unlock() if o.done == 0 { atomic.StoreUint32(&o.done, 1) f() } } func (o *Once) Reset() { o.m.Lock() defer o.m.Unlock() atomic.StoreUint32(&o.done, 0) }