Опишите основной технологический стек, с которым вы работали. Какие инструменты и фреймворки вы использовали в проектах на Go?

Ответ

Мой основной стек для backend-разработки строится вокруг языка Go и его экосистемы. Я группирую технологии по их назначению:

  • Язык: Golang — за его производительность, простоту, строгую типизацию и отличную поддержку конкурентности.
  • Базы данных:
    • PostgreSQL: Как основная реляционная СУБД для хранения структурированных данных. Работал через стандартный database/sql и драйвер lib/pq или pgx.
    • Redis: Как in-memory хранилище для кэширования, очередей и управления сессиями.
  • API и сетевое взаимодействие:
    • REST API: Проектирование и реализация с использованием фреймворка Gin или стандартной библиотеки net/http.
    • gRPC: Для высокопроизводительного межсервисного взаимодействия в микросервисной архитектуре.
  • Инфраструктура и DevOps:
    • Docker: Для контейнеризации приложений, что обеспечивает консистентность окружения.
    • Kubernetes: Для оркестрации контейнеров, автоматического масштабирования и управления развертыванием.
  • Библиотеки и ORM:
    • GORM: Для упрощения работы с PostgreSQL, хотя в высоконагруженных системах предпочитаю sqlx или чистый database/sql для большего контроля.
    • Viper: Для управления конфигурацией приложения.

Пример кода на Golang для работы с PostgreSQL (с pgx):

package main

import (
    "context"
    "fmt"
    "os"

    "github.com/jackc/pgx/v4"
)

func main() {
    // Подключение к базе данных
    connStr := "user=postgres dbname=test sslmode=disable"
    conn, err := pgx.Connect(context.Background(), connStr)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Unable to connect to database: %vn", err)
        os.Exit(1)
    }
    // Важно закрыть соединение
    defer conn.Close(context.Background())

    // Выполнение запроса с параметрами для защиты от SQL-инъекций
    name := "Alice"
    email := "alice@example.com"
    _, err = conn.Exec(context.Background(), "INSERT INTO users (name, email) VALUES ($1, $2)", name, email)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Exec failed: %vn", err)
        os.Exit(1)
    }
    fmt.Println("Запись успешно добавлена!")
}

Ответ 18+ 🔞

А, ну вот, смотри, я тебе сейчас свой стек разложу по полочкам, как в хорошем баре — что для чего и почему. Ты только не падай в обморок, там всё логично, хоть и звучит, как инвентарь сумасшедшего инженера.

Основной мой инструмент, на котором всё держится — это Golang. Ну, Go, короче. Почему? Да потому что он, блядь, быстрый как удар током, простой как три копейки, и с его конкурентностью можно такие штуки вытворять, что глаза на лоб лезут. И типизация строгая — не похулиганить.

Теперь, базы данных, без них нихуя.

  • PostgreSQL — это мой тяжёлый артиллерийский калибр. Всё, что должно лежать ровно, структурировано и не сдохнуть — оно туда. Работаю либо через родной database/sql, либо через pgx, который вообще огонь.
  • Redis — это моя шустрая обезьянка в оперативке. Кэш, очереди, сессии — всё, что нужно сделать быстро-быстро, пока никто не видит. Мартышлюшка незаменимая.

Дальше, общение с внешним миром.

  • REST API — тут либо на чистом net/http, либо, если хочется чуть больше сахара, беру Gin. Чтобы всё по феншую, с роутингом и middleware.
  • gRPC — а это когда сервисы между собой на повышенных тонах общаться начинают. Микросервисы, высокая нагрузка — тут он царь и бог.

Инфраструктура, где всё это безобразие живёт.

  • Docker — чтобы приложение, как преступник в изоляторе, сидело в своём контейнере и ни на что не влияло. Консистентность, ёпта!
  • Kubernetes — а это уже начальник над этими самыми изоляторами. Чтобы они сами масштабировались, перезапускались и вообще вели себя прилично. Без него сейчас — как без штанов.

Библиотеки, без которых жить скучно.

  • GORM — для быстрого прототипирования с PostgreSQL. Хотя, честно, на продакшене часто отказываюсь в пользу sqlx или даже голого SQL. Контроль, блядь, важнее магии.
  • Viper — чтобы конфиги не раскидывались по всему проекту, как тараканы. Всё в одном месте, красиво и удобно.

А вот, смотри, кусочек кода, как я с Постгресом через pgx общаюсь. Никакой магии, всё честно.

package main

import (
    "context"
    "fmt"
    "os"

    "github.com/jackc/pgx/v4"
)

func main() {
    // Подключение к базе данных
    connStr := "user=postgres dbname=test sslmode=disable"
    conn, err := pgx.Connect(context.Background(), connStr)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Unable to connect to database: %vn", err)
        os.Exit(1)
    }
    // Важно закрыть соединение
    defer conn.Close(context.Background())

    // Выполнение запроса с параметрами для защиты от SQL-инъекций
    name := "Alice"
    email := "alice@example.com"
    _, err = conn.Exec(context.Background(), "INSERT INTO users (name, email) VALUES ($1, $2)", name, email)
    if err != nil {
        fmt.Fprintf(os.Stderr, "Exec failed: %vn", err)
        os.Exit(1)
    }
    fmt.Println("Запись успешно добавлена!")
}

Вот примерно так, вся моя кухня. Ничего лишнего, но и голым не останешься. Главное — понимать, зачем каждый инструмент, а не просто тыкать в них, как обезьяна палкой.