package
1.0.36
Repository: https://github.com/axgrid/axutils.git
Documentation: pkg.go.dev

# README

axutils

axutils - это библиотека Go, предоставляющая различные утилиты для работы с каналами, коллекциями и другими часто используемыми структурами данных. Эта библиотека разработана для упрощения работы с асинхронными операциями и обработкой данных в Go-приложениях.

Установка

Для установки библиотеки используйте команду:

go get github.com/axgrid/axutils

Утилиты для работы с коллекциями

GuavaMap

GuavaMap - это реализация карты с дополнительными возможностями, вдохновленная библиотекой Guava от Google.

Основные возможности:

  • Автоматическая загрузка значений при обращении к несуществующему ключу
  • Ограничение максимального количества элементов
  • Автоматическая выгрузка элементов при превышении лимита
  • Таймауты на чтение и запись
  • Возможность блокировки для обновления значений

Пример использования:

guavaMap := collections.NewGuavaMap[string, int]().
WithLoadFunc(func(key string) (int, error) {
    // Загрузка значения из внешнего источника
    return len(key), nil
}).
WithMaxCount(100).
WithReadTimeout(5 * time.Minute).
Build()

value, err := guavaMap.Get("example")
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Value: %d\n", value)

WaitMap

WaitMap - это реализация карты с поддержкой ожидания значений и автоматической очисткой устаревших данных.

Основные возможности:

  • Асинхронное ожидание значений
  • Автоматическая очистка данных по TTL
  • Таймауты на запросы
  • Контекст для управления жизненным циклом
  • Потокобезопасные операции

Пример использования:

waitMap := collections.NewWaitMap[string, int]().
    WithRequestTimeout(10 * time.Second).
    WithResponseTtl(5 * time.Minute).
    WithContext(ctx).
    Build()

// Асинхронная установка значения
go func() {
    time.Sleep(2 * time.Second)
    waitMap.Set("key", 42)
}()

// Ожидание значения
value := waitMap.Wait("key")
fmt.Printf("Received value: %d\n", value)

StructUniqSet

StructUniqSet - это реализация множества для хранения уникальных структур с поддержкой TTL.

Основные возможности:

  • Хранение уникальных структур любого типа
  • Автоматическая очистка устаревших элементов
  • Настраиваемая функция построения хеша
  • Потокобезопасные операции
  • Контроль времени жизни элементов

Пример использования:

type MyStruct struct {
    ID   int
    Name string
}

set := collections.NewStructUniqSet[MyStruct]().
    WithElementTtl(30 * time.Minute).
    WithCheckInterval(time.Second).
    WithContext(ctx).
    Build()

item := MyStruct{ID: 1, Name: "example"}
added, err := set.Add(item)
if err != nil {
    log.Fatal(err)
}

exists, _ := set.Has(item)
fmt.Printf("Item exists in set: %v\n", exists)

HashSet

HashSet - это реализация множества на основе хэш-таблицы.

Основные возможности:

  • Быстрое добавление и проверка наличия элементов
  • Опциональное ограничение максимального количества элементов
  • Потокобезопасные операции

Пример использования:

hashSet := collections.NewHashSet[string]().
WithMaxCount(1000).
Build()

hashSet.Add("example")
exists := hashSet.Has("example")
fmt.Printf("'example' exists in set: %v\n", exists)

MapMutex и MapRWMutex

MapMutex и MapRWMutex - это утилиты для создания отдельных блокировок для каждого ключа в map.

Пример использования:

mapMutex := collections.NewMapMutex[string]()

mapMutex.Lock("key1")
// Критическая секция для "key1"
mapMutex.Unlock("key1")

SimpleMap

SimpleMap - это простая реализация потокобезопасной карты.

Пример использования:

simpleMap := collections.NewSimpleMap[string, int]()

simpleMap.Set("key", 42)
value, exists := simpleMap.Get("key")
if exists {
    fmt.Printf("Value: %d\n", value)
}

ResponseMap

ResponseMap - это специализированная карта для работы с асинхронными ответами.

Основные возможности:

  • Ожидание значения по ключу
  • Установка значения с таймаутом
  • Автоматическое удаление устаревших значений

Пример использования:

responseMap := collections.NewResponseMap[string, int]().
WithTimeout(5 * time.Second).
Build()

go func() {
    time.Sleep(2 * time.Second)
    responseMap.Set("key", 42)
}()

value := responseMap.Wait("key")
fmt.Printf("Received value: %d\n", value)

RequestMap

RequestMap - это потокобезопасная реализация карты для кэширования асинхронных запросов с автоматической дедупликацией и очисткой устаревших данных.

Основные возможности:

  • Автоматическая дедупликация параллельных запросов с одинаковым ключом
  • Кэширование результатов с настраиваемым временем жизни (TTL)
  • Автоматическая очистка устаревших данных
  • Потокобезопасные операции
  • Поддержка обобщённых типов для ключей и значений
  • Обработка ошибок при загрузке данных
  • Поддержка таймаутов для операций загрузки

Методы:

  • GetOrCreate(key K, f func(k K) V) V - получает значение по ключу или создает новое, используя переданную функцию
  • GetOrCreateWithErr(key K, f func(k K) (V, error)) (V, error) - аналогичен GetOrCreate, но поддерживает обработку ошибок
  • Timeout(duration time.Duration, f func(k K) (V, error)) func(k K) (V, error) - создает функцию с таймаутом для загрузки данных

Примеры использования:

// Создаем карту с временем жизни кэша 5 минут
requestMap := collections.NewRequestMap[string, int](5 * time.Minute)

// Базовый пример с GetOrCreate
result := requestMap.GetOrCreate("example", func(key string) int {
    // Имитация загрузки данных
    time.Sleep(time.Second)
    return len(key)
})
fmt.Printf("Simple result: %d\n", result)

// Пример с обработкой ошибок
result, err := requestMap.GetOrCreateWithErr("example", func(key string) (int, error) {
    // Имитация загрузки данных с возможной ошибкой
    if len(key) == 0 {
        return 0, errors.New("empty key")
    }
    return len(key), nil
})
if err != nil {
    log.Printf("Error: %v\n", err)
} else {
    fmt.Printf("Result with error handling: %d\n", result)
}

// Пример использования таймаута
loadWithTimeout := requestMap.Timeout(2*time.Second, func(key string) (int, error) {
    // Имитация долгой загрузки
    time.Sleep(3 * time.Second)
    return len(key), nil
})

result, err = loadWithTimeout("example")
if err == collections.ErrTimeout {
    fmt.Println("Operation timed out")
} else if err != nil {
    fmt.Printf("Error: %v\n", err)
} else {
    fmt.Printf("Result with timeout: %d\n", result)
}

Заключение

Библиотека axutils предоставляет широкий набор инструментов для эффективной работы с данными и асинхронными операциями в Go. Использование этих утилит может значительно упростить разработку и повысить производительность ваших приложений.

Для получения дополнительной информации о других утилитах библиотеки, пожалуйста, обратитесь к документации кода или примерам использования.

# Functions

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# Variables

No description provided by the author

# Structs

No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author

# Interfaces

No description provided by the author

# Type aliases

No description provided by the author
No description provided by the author