← Назад к вопросам

Какие используешь библиотеки в Go?

1.6 Junior🔥 301 комментариев
#Микросервисы и архитектура#Основы Go

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Мои основные библиотеки в Go (стандартные и сторонние)

При разработке на Go я использую сочетание стандартной библиотеки (которая невероятно богата) и проверенных временем сторонних пакетов. Вот ключевые категории:

Стандартная библиотека (stdlib)

Основа любого Go-проекта - стандартная библиотека, которая покрывает 80% потребностей:

// Примеры часто используемых пакетов stdlib
import (
    "context"    // Управление жизненным циклом и отменами
    "encoding/json" // Работа с JSON
    "fmt"        // Форматированный ввод-вывод
    "io"         // Интерфейсы ввода-вывода
    "net/http"   // HTTP-клиент и сервер
    "sync"       // Примитивы синхронизации
    "time"       // Работа со временем
    "testing"    // Написание тестов
    "os"         // Взаимодействие с ОС
    "strings"    // Манипуляции со строками
)

Сторонние библиотеки для веб-разработки

Для REST API и веб-приложений:

  1. Маршрутизация: github.com/gorilla/mux или github.com/go-chi/chi - более гибкие, чем стандартный http.ServeMux
  2. Валидация: github.com/go-playground/validator - валидация структур на основе тегов
  3. Конфигурация: github.com/spf13/viper - гибкое управление конфигурацией
  4. Миграции БД: github.com/golang-migrate/migrate - управление миграциями баз данных

Работа с базами данных

// Для SQL-баз данных
import (
    "database/sql" // Стандартный интерфейс
    _ "github.com/lib/pq"       // Драйвер PostgreSQL
    _ "github.com/go-sql-driver/mysql" // Драйвер MySQL
    
    // ORM/Query Builder (по необходимости)
    "github.com/jmoiron/sqlx"   // Расширение database/sql
)

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

type User struct {
    ID   int    `db:"id"`
    Name string `db:"name"`
}

var users []User
err := db.Select(&users, "SELECT * FROM users WHERE active = ?", true)

Взаимодействие с внешними API

  1. HTTP-клиенты: Стандартный net/http часто дополняю github.com/go-resty/resty для удобства
  2. Генерация клиентов: github.com/go-swagger/go-swagger для автоматической генерации из OpenAPI спецификаций

Распределенные системы и микросервисы

  1. gRPC: google.golang.org/grpc + github.com/grpc-ecosystem/go-grpc-middleware
  2. Message Brokers: github.com/Shopify/sarama для Apache Kafka
  3. Service Discovery: github.com/hashicorp/consul/api для Consul
  4. Tracing: go.opentelemetry.io/otel для распределенной трассировки

Тестирование и качество кода

import (
    "testing"                    // Стандартный фреймворк
    "github.com/stretchr/testify/assert" // Утверждения
    "github.com/stretchr/testify/suite"  // Тестовые сьюты
    "github.com/golang/mock/gomock"      // Мокирование
)

testify значительно улучшает читаемость тестов:

func TestCalculate(t *testing.T) {
    result := Calculate(2, 3)
    assert.Equal(t, 5, result, "they should be equal")
    assert.NotNil(t, result)
}

Утилиты и вспомогательные пакеты

  1. Логирование: github.com/sirupsen/logrus или стандартный log/slog из Go 1.21+
  2. Работа со временем: github.com/jinzhu/now для сложных операций с датами
  3. Управление зависимостями: github.com/google/wire для dependency injection
  4. Кэширование: github.com/patrickmn/go-cache для in-memory кэша

Мои принципы выбора библиотек

  1. Минимализм: Предпочитаю стандартную библиотеку, если она покрывает потребности
  2. Стабильность: Выбираю библиотеки с активным сообществом и регулярными обновлениями
  3. Производительность: Обращаю внимание на бенчмарки и избегаю "тяжелых" решений там, где нужна скорость
  4. Совместимость: Проверяю поддержку последних версий Go
  5. Тестируемость: Предпочитаю библиотеки с хорошим покрытием тестами

Пример структуры импортов в реальном проекте

import (
    // Стандартная библиотека
    "context"
    "database/sql"
    "encoding/json"
    "fmt"
    "net/http"
    "time"
    
    // Сторонние пакеты
    "github.com/go-chi/chi"
    "github.com/go-playground/validator"
    "github.com/jmoiron/sqlx"
    "github.com/lib/pq"
    "github.com/sirupsen/logrus"
    "github.com/spf13/viper"
    
    // Внутренние пакеты
    "myproject/internal/models"
    "myproject/pkg/utils"
)

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

Для управления зависимостями использую Go Modules (go.mod), который стал стандартом с Go 1.16. Он обеспечивает воспроизводимость сборок и версионность зависимостей.

Какие используешь библиотеки в Go? | PrepBro