кэширование функций 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))
}