package concurrency import "sync" type AtomicCounter struct { mutex sync.Mutex lastValue int } func NewAtomicCounter() *AtomicCounter { return &AtomicCounter{ mutex: sync.Mutex{}, lastValue: 0, } } func (counter *AtomicCounter) GetAndIncrement() int { counter.mutex.Lock() defer counter.mutex.Unlock() val := counter.lastValue counter.lastValue++ return val }