«Создание Rest API с помощью Go анализ данных для временных рядов»

«Анализ данных для временных рядов с использованием Go для создания Rest API»

Пошаговый пример операций CRUD и статистического анализа с использованием Go, Gin и Gorm.

„Учимся Go“, Гиулиа Роджия. Используется с разрешения.

Введение

Эта статья иллюстрирует пример REST API, созданного на Go для выполнения операций CRUD (Создание, Чтение, Обновление, Удаление) и вычисления статистики на данных временных рядов.

Полный код, использованный в этой статье, доступен здесь.

Почему Go?

Go является распространенным выбором для создания REST API по нескольким причинам. Несмотря на то, что это эффективный скомпилированный язык, его синтаксис прост и читаем. Это позволяет легко реализовывать параллельную обработку. Он предоставляет богатую функциональность в стандартной библиотеке и имеет отличную экосистему библиотек и инструментов.

В этом примере мы используем две популярные библиотеки Go:

  • Gin: веб-фреймворк, предоставляющий инструменты для создания веб-приложений.
  • Gorm: полнофункциональное ORM (Object-Relational Mapping) для взаимодействия с базами данных.

Структура папок

Мы создаем одну папку для каждой “службы”. В Go каждая папка соответствует пакету, и каждый файл имеет доступ к элементам, определенным в других файлах в том же пакете. Вот структура папок, используемая в проекте:

├── database│   └── database.go├── models│   └── models.go├── handlers│   ├── routes.go│   ├── stats.go│   ├── timeseries.go│   └── timeseriesvalues.go├── stats│   └── stats.go├── go.mod├── go.sum└── main.go

Модели и база данных

Давайте начнем с определения моделей ORM в файле models.go для представления данных временных рядов. Мы используем две модели, одну для идентификации ряда и одну для хранения его значений. Каждое значение связано с временным рядом через внешний ключ.

type TimeSeries struct { ID   int    `gorm:"primaryKey"` Name string `gorm:"not null"`}type TimeSeriesValue struct { ID           int `gorm:"primaryKey"` Time         time.Time Value        float64 TimeSeriesID int `gorm:"not null"`}