sync.OnceValue[T](f func() T) (Go 1.21+)?sync.OnceValue(f) возвращает функцию с той же сигнатурой, что и f, но выполняет f только при первом вызове. Все последующие вызовы возвращают закешированное значение.
var loadConfig = sync.OnceValue(func() *Config {
return readConfigFromFile()
})
cfg := loadConfig() // первый вызов - читает файл
cfg2 := loadConfig() // второй - возвращает тот же *Config
Внутри используется sync.Once, поэтому безопасно вызывать из нескольких горутин. Для функций с двумя возвращаемыми значениями есть sync.OnceValues.
Удобная замена ручному once.Do + глобальной переменной для ленивой инициализации одного значения.