кэширование функций golang

package main import ( "fmt" "sync" "time" ) // Функция, которую мы хотим кэшировать func expensiveFunction(key string) string { time.Sleep(2 * time.Second) // Имитация долгой работы return fmt.Sprintf("result for %s", key) } // Кэш var cache = sync.Map{} // Кэшированная версия функции func cachedFunction(key string, fn func(string) string, useCache bool) string { if useCache { // Проверяем, есть ли результат в кэше if val, ok := cache.Load(key); ok { return val.(string) } // Если результата нет, вызываем функцию и сохраняем результат в кэше result := fn(key) cache.Store(key, result) return result } // Если кэширование не требуется, просто вызываем функцию return fn(key) } func main() { start := time.Now() fmt.Println(cachedFunction("key1", expensiveFunction, true)) // Первый вызов с кэшированием fmt.Println("Time taken:", time.Since(start)) start = time.Now() fmt.Println(cachedFunction("key1", expensiveFunction, true)) // Второй вызов (из кэша) fmt.Println("Time taken:", time.Since(start)) start = time.Now() fmt.Println(cachedFunction("key1", expensiveFunction, false)) // Третий вызов без кэширования fmt.Println("Time taken:", time.Since(start)) }