Go-библиотеки, которые нужны каждому разработчику: полный обзор экосистемы

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему экосистема Go — это ваш главный козырь

Когда вы начинаете проект на Go, первое, о чём вы задумываетесь — не синтаксис и не компилятор. Вы ищете Go библиотеки, которые возьмут на себя рутину и позволят сосредоточиться на бизнес-логике. Экосистема Golang за последние годы превратилась в настоящий арсенал: здесь есть всё — от легковесных HTTP-роутеров до мощных ORM и инструментов для работы с конфигурацией.

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

1. HTTP-роутинг: Chi vs Fiber vs Gin

Начнём с самого востребованного — веб-фреймворков. В Go экосистеме есть три главных претендента: chi, fiber и gin. Каждый из них решает одну задачу — быстрая маршрутизация запросов — но подходит к ней по-своему.

Chi — минимализм и совместимость

Chi — это легковесный роутер, который полностью совместим со стандартным пакетом net/http. Он не навязывает свою архитектуру, а просто расширяет возможности стандартной библиотеки. Если вы цените чистоту кода и не хотите зависеть от тяжёлого фреймворка — Chi ваш выбор.

package main

import (
    "fmt"
    "net/http"

    "github.com/go-chi/chi/v5"
)

func main() {
    r := chi.NewRouter()

    r.Get("/hello/{name}", func(w http.ResponseWriter, r *http.Request) {
        name := chi.URLParam(r, "name")
        fmt.Fprintf(w, "Привет, %s!", name)
    })

    http.ListenAndServe(":8080", r)
}

Fiber — скорость и Express-подобный API

Fiber вдохновлён Node.js-фреймворком Express и ориентирован на максимальную производительность. Он использует fasthttp под капотом, что даёт прирост скорости, но жертвует полной совместимостью с net/http. Если вам нужно обрабатывать тысячи запросов в секунду — присмотритесь к Fiber.

package main

import "github.com/gofiber/fiber/v2"

func main() {
    app := fiber.New()

    app.Get("/hello/:name", func(c *fiber.Ctx) error {
        return c.SendString("Привет, " + c.Params("name"))
    })

    app.Listen(":3000")
}

Gin — проверенный ветеран

Gin — самый популярный фреймворк в Go. Он быстр, имеет богатую экосистему middleware и огромное сообщество. Gin идеален для REST API и микросервисов, где нужна встроенная валидация, логирование и обработка ошибок.

2. Работа с базами данных: sqlc, GORM и pgx

Любой серьёзный проект требует взаимодействия с базой данных. В Golang есть три подхода: генерация кода, ORM и прямой драйвер. Рассмотрим их.

sqlc — генерируем типизированный Go-код из SQL

sqlc — это не просто библиотека, а генератор кода. Вы пишете обычный SQL, а sqlc создаёт для вас Go-функции с полной типизацией. Это даёт контроль над запросами, отсутствие магии ORM и безопасность на уровне компиляции.

-- schema.sql
CREATE TABLE users (
    id   SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);

-- query.sql
-- name: GetUser :one
SELECT * FROM users WHERE id = $1;

На выходе вы получаете сгенерированный код, который можно использовать так:

user, err := queries.GetUser(ctx, db, 1)
if err != nil {
    log.Fatal(err)
}
fmt.Println(user.Name)

GORM — полноценный ORM для быстрого старта

GORM — самый популярный ORM в Go экосистеме. Он поддерживает миграции, связи, хуки и автоматическое управление транзакциями. Если вы привыкли к ActiveRecord из Rails или Django — GORM покажется знакомым.

type User struct {
    gorm.Model
    Name  string
    Email string
}

db.AutoMigrate(&User{})

// Создание
db.Create(&User{Name: "Алексей", Email: "alex@example.com"})

// Чтение
var user User
db.First(&user, 1)

pgx — прямой доступ к PostgreSQL

pgx — это драйвер PostgreSQL с расширенными возможностями: поддержка COPY, LISTEN/NOTIFY и native JSONB. Если вам нужна максимальная производительность и полный контроль над запросами — используйте pgx.

3. Конфигурация и переменные окружения: Viper

Настройки приложения — это вечная головная боль. Viper — король конфигурации в Golang. Он умеет читать JSON, YAML, TOML, переменные окружения и даже удалённые хранилища (etcd, Consul).

viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")

viper.AutomaticEnv() // читает переменные окружения

if err := viper.ReadInConfig(); err != nil {
    log.Fatalf("Ошибка чтения конфига: %s", err)
}

dbHost := viper.GetString("database.host")
port := viper.GetInt("server.port")

Viper также поддерживает привязку к структурам через теги:

type Config struct {
    Database struct {
        Host string `mapstructure:"host"`
        Port int    `mapstructure:"port"`
    } `mapstructure:"database"`
}

var cfg Config
viper.Unmarshal(&cfg)

4. CLI-инструменты: Cobra — стандарт де-факто

Почти каждый второй Go-проект — это CLI-утилита. Cobra — это фреймворк для создания мощных консольных приложений. Его используют Kubernetes, Hugo, Docker и многие другие.

var rootCmd = &cobra.Command{
    Use:   "myapp",
    Short: "Моё приложение для демонстрации",
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("Запуск myapp...")
    },
}

var greetCmd = &cobra.Command{
    Use:   "greet [name]",
    Short: "Приветствует пользователя",
    Args:  cobra.ExactArgs(1),
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Printf("Привет, %s!\n", args[0])
    },
}

func main() {
    rootCmd.AddCommand(greetCmd)
    rootCmd.Execute()
}

Cobra автоматически генерирует help, поддерживает флаги, вложенные команды и автодополнение для bash/zsh

Блоги

Рекомендаций по книгам