🟡 Средний · 2 очк. Пакет sync
Что делает sync.OnceValue[T](f func() T) (Go 1.21+)?
A Возвращает функцию, вызывающую f один раз и кеширующую результат
B Создаёт атомарную переменную
C Вычисляет f в отдельной горутине
D Оборачивает f в sync.Mutex
Объяснение вопроса

sync.OnceValue(f) возвращает функцию с той же сигнатурой, что и f, но выполняет f только при первом вызове. Все последующие вызовы возвращают закешированное значение.

var loadConfig = sync.OnceValue(func() *Config {
    return readConfigFromFile()
})
cfg := loadConfig()  // первый вызов - читает файл
cfg2 := loadConfig() // второй - возвращает тот же *Config

Потокобезопасность

Внутри используется sync.Once, поэтому безопасно вызывать из нескольких горутин. Для функций с двумя возвращаемыми значениями есть sync.OnceValues.

Удобная замена ручному once.Do + глобальной переменной для ленивой инициализации одного значения.

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.