Как sync.Once реализован внутри?

Middle
128 просмотров
AFK Offer AI

sync.Once содержит done uint32 и Mutex. Fast path: atomic.LoadUint32(&done) == 1 → return (без лока). Slow path: Lock, проверка done снова (double-check), вызов функции, atomic.StoreUint32(&done, 1), Unlock. С Go 1.21 добавлены OnceFunc, OnceValue, OnceValues — обёртки возвращающие результат. Никогда не вызывает функцию дважды даже при панике.

Следующий вопрос

Как спроектировать notification service на Go?