Почему экосистема 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