Golang Books
16.2K subscribers
241 photos
4 videos
334 files
239 links
Библиотека Golang разработчика

По всем вопросам- @haarrp

@Golang_google - Golang

@golangl - golang chat

@GolangJobsit - golang channel jobs

@golangtests golang tests

@itchannels_telegram - 🔥лучшие ит-каналы

№ 5032829002
Download Telegram
📚 Организация middleware в Go без сторонних зависимостей

Если ты пишешь веб-приложения на Go и хочешь избавиться от внешних зависимостей вроде alice, статья от Алекса Эдвардса — must read:
https://www.alexedwards.net/blog/organize-your-go-middleware-without-dependencies

📌 В чем суть:

• Проблема: стандартная библиотека Go не даёт удобного способа цепочечного подключения middleware
• Цель: избежать дублирования кода и сделать middleware масштабируемыми без сторонних пакетов

💡 Решение — создать собственный тип chain, который позволяет «наматывать» middleware на обработчики:


type chain []func(http.Handler) http.Handler

func (c chain) then(h http.Handler) http.Handler {
for i := len(c) - 1; i >= 0; i-- {
h = c[i](h)
}
return h
}

func (c chain) thenFunc(h http.HandlerFunc) http.Handler {
return c.then(h)
}


Теперь ты можешь описывать цепочки middleware так:


mux := http.NewServeMux()

baseChain := chain{requestID, logRequest}
adminChain := append(baseChain, authenticateUser, requireAdminUser)

mux.Handle("GET /", baseChain.thenFunc(home))
mux.Handle("GET /admin", adminChain.thenFunc(showAdminDashboard))


Этот подход:
• Простой
• Без зависимостей
• Легко расширяется

Полная статья и объяснения тут:

@golang_books
Please open Telegram to view this post
VIEW IN TELEGRAM
🔧 Terraform + Argo CD: современный способ интеграции для GitOps

В этой свежей статье предложен элегантный способ связать Terraform и Argo CD в рамках GitOps-подхода.

📌 В чём проблема:
Terraform управляет инфраструктурой, а Argo CD — приложениями в Kubernetes. Но часто возникает разрыв: как передавать выходные данные Terraform (outputs) в Argo CD, чтобы оно подхватывало созданные ресурсы (например, адреса сервисов, пути, переменные)?

🧠 Ключевая идея:
Использовать multi-source Argo CD Application — это позволяет в одном объекте Application подключить сразу несколько Git-репозиториев или путей:
- один для output’ов из Terraform (в виде YAML-файлов)
- второй — с настоящими Kubernetes-манифестами приложений

🛠 Пример потока:
1. Terraform генерирует output-файл (например, с URL или secrets) и коммитит в Git
2. Argo CD отслеживает этот файл как отдельный источник
3. Приложение автоматически получает эти значения и применяет манифесты с учётом output’ов

🎯 Зачем это нужно:
• меньше ручной синхронизации
• больше автоматизации в CI/CD
• централизованный контроль через Git
• минимальные костыли: без сторонних скриптов, прокладок и Helm magic

📎 Поддерживается в Argo CD начиная с версии 2.6+
Подробный YAML-пример и реализация — в оригинальной статье 👉 [akuity.io](https://akuity.io/blog/yet-another-take-on-integrating-terraform-with-argo-cd)

💡 Отличный способ повысить чистоту GitOps и устранить разрыв между инфраструктурой и приложениями.

📌 Читать
Beelzebub Honeypot - платформа для анализа киберугроз, специализирующуюся на выявлении и изучении криптоджекинга — скрытого майнинга криптовалюты на чужих устройствах без ведома владельцев.

🔍 Как работает Beelzebub Honeypot
Beelzebub — это низкокодовая honeypot-фреймворк, позволяющая быстро развернуть ловушки для киберпреступников. Особенность проекта — интеграция с моделью GPT-4o, что обеспечивает реалистичное поведение системы и привлекает злоумышленников для более глубокого анализа их действий.

💰 Исследование криптоджекинга
В рамках одного из экспериментов Beelzebub была зафиксирована атака, при которой злоумышленник использовал вредоносное ПО для:

- Удаления конкурирующих майнеров с системы жертвы.

- Установки собственного майнера xmrig через скрипт с сервера c3pool.org.
beelzebub-honeypot.com

- Майнинга криптовалюты Monero (XMR) на свой кошелек.


За короткий период злоумышленнику удалось добыть 20 XMR, что эквивалентно примерно $4126.

🛡️ Противодействие угрозам
После обнаружения атаки команда Beelzebub:

- Заблокировала вредоносный кошелек в пуле c3pool.
beelzebub-honeypot.com

- Удалили все связанные с ним майнеры, предотвращая дальнейшее распространение угрозы.

📌 Основные преимущества Beelzebub
Быстрая настройка honeypot-серверов через YAML-конфигурации.

- Интеграция с LLM (GPT-4o) для реалистичного взаимодействия с атакующими.

- Открытый исходный код и активное сообщество разработчиков.

- Поддержка различных протоколов (SSH, HTTP, TCP) и интеграция с Docker и Kubernetes.

Beelzebub Honeypot
— мощный инструмент для специалистов по кибербезопасности, позволяющий не только выявлять, но и глубоко анализировать современные угрозы, такие как криптоджекинг, и эффективно им противодействовать.

https://beelzebub-honeypot.com/blog/how-cybercriminals-make-money-with-cryptojacking/
Please open Telegram to view this post
VIEW IN TELEGRAM
🛠️ История создания “storage-agnostic” message queue

Автор — Fahim Faisaal — делится опытом разработки гибкой очереди задач на Go, которая может использовать любые хранилища: in-memory, Redis, SQLite и др. :contentReference[oaicite:0]{index=0}

Контекст:
Занимаясь на Go, автор вдохновился инструментами из Node.js экосистемы (BullMQ, RabbitMQ) и захотел сделать что-то похожее, но с нуля, без зависимостей. Так родилась идея — сначала он создал Gocq (Go Concurrent Queue): простую concurrent-очередь, работающую через каналы :contentReference[oaicite:1]{index=1}.

Основная проблема

Gocq отлично работал в памяти, но не поддерживал устойчивое хранение задач.
Автор задумался: а можно ли сделать очередь, не зависящую от конкретного хранилища — так, чтобы её можно было подключить к Redis, SQLite или совсем без них?
🧱 Как это реализовано в VarMQ

После рефакторинга Gocq был разделён на два компонента:
1. Worker pool — пул воркеров, обрабатывающих задачи.
2. Queue interface — абстракция над очередью, не зависящая от реализации.

Теперь воркер просто берёт задачи из очереди, не зная, где они живут. :contentReference[oaicite:2]{index=2}

---

### 🧠 Пример использования

- In-memory очередь:

w := varmq.NewVoidWorker(func(data any) {
// обработка задачи
}, 2)
q := w.BindQueue()


- С SQLite-поддержкой:

import "github.com/goptics/sqliteq"

db := sqliteq.New("test.db")
pq, _ := db.NewQueue("orders")
q := w.WithPersistentQueue(pq)


- С Redis (для распределённой обработки):

import "github.com/goptics/redisq"

rdb := redisq.New("redis://localhost:6379")
pq := rdb.NewDistributedQueue("transactions")
q := w.WithDistributedQueue(pq)


В итоге воркер обрабатывает задачи одинаково — независимо от хранилища. :contentReference[oaicite:3]{index=3}

Почему это круто


- Гибкость: адаптеры позволяют легко менять хранилище без правок воркера.
- Минимальные зависимости: в ядре — zero-deps, весь функционал — через адаптеры.
- Self-hosted и легковесно: можно развернуть локально или в продакшене.
- Написано на Go: использует горутины и каналы, удобен и эффективен.

📣 Отзывы сообщества

На Reddit отметили, что автор добился "queue system that doesn’t care if your storage is Redis, SQLite, or even in-memory" :contentReference[oaicite:4]{index=4}

🔗 Ссылки
- Статья: A Story of Building a Storage‑Agnostic Message Queue на DEV :contentReference[oaicite:5]{index=5}
- GitHub VarMQ (Var-storage-agnostic message queue): репозиторий с кодом адаптеров и примерами использования :contentReference[oaicite:6]{index=6}

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

📌 Читать
🧪 Go synctest — решение для нестабильных (flaky) тестов

Flaky-тесты в многопоточном Go-коде — боль. Новый экспериментальный инструмент synctest из Go 1.24 решает эту проблему с помощью синтетического времени и контроля исполнения goroutine.

📌 Что это такое:
synctest — специальный режим, запускающий тесты в изолированной "песочнице", где:
time.Sleep не ждёт реального времени
• все goroutine исполняются детерминированно
• нет зависимости от планировщика и нагрузки ОС

🔧 Пример:


import "testing/synctest"

func TestSharedValue(t *testing.T) {
synctest.Run(func() {
var shared atomic.Int64
go func() {
shared.Store(1)
time.Sleep(1 * time.Microsecond)
shared.Store(2)
}()
time.Sleep(5 * time.Microsecond)
if shared.Load() != 2 {
t.Errorf("shared = %d, want 2", shared.Load())
}
})
}


Даже с Sleep, результат всегда стабилен. Без synctest такой тест может иногда проваливаться.

⚙️ Преимущества:
Устранение race-условий при тестировании
Нет задержек — Sleep срабатывает мгновенно
Можно тестировать поведение с точностью до микросекунды
Подходит для любых atomic, mutex, select, time.After и др.

🚫 Ограничения:
• Пока экспериментально: нужно запускать с GOEXPERIMENT=synctest
• Не подходит для ввода-вывода, работы с сетью или временем вне "bubble"

📖 Подробнее:
https://victoriametrics.com/blog/go-synctest/
Расширенный_гайд_по_Docker_для_DevOps_специалистов_1_2.pdf
391.1 KB
🐳 Docker без боли: Огромный гайд от новичка до профи

🚀 Пришло время расставить всё по полочкам. В этом большом гайде ты узнаешь:

• как устроен Docker изнутри
• как упаковать любое приложение в контейнер
• как запускать десятки сервисов одной командой
• как дебажить, оптимизировать и защищать контейнеры
• как не сойти с ума с volumes, networks и образами

🎯 Без скучной теории — только практические команды, схемы и лайфхаки от тех, кто использует Docker в продакшене.
Сохраняй и делись с коллегами, чтобы не потерять

👉 Читать онлайн

@golang_books
Please open Telegram to view this post
VIEW IN TELEGRAM
📢 GORM теперь поддерживает дженерики — работа с БД в Go стала ещё проще и безопаснее!

С версии GORM v1.30.0 появилась полноценная поддержка дженериков (Go 1.18+), которая позволяет писать более выразительный и типобезопасный код без шаблонных повторов.

🔧 Пример:


ctx := context.Background()

// Создание
gorm.G[User](db).Create(ctx, &User{Name: "Alice"})

// Поиск
user, err := gorm.G[User](db).Where("name = ?", "Alice").First(ctx)

// Обновление
gorm.G[User](db).Where("id = ?", user.ID).Update(ctx, "age", 30)

// Удаление
gorm.G[User](db).Where("id = ?", user.ID).Delete(ctx)


Что это даёт:
• Типобезопасность на этапе компиляции
• Более компактный и читаемый код
• Лёгкая интеграция с OnConflict, Joins, Hints, Preload и пр.
• Улучшенный DX (developer experience)

📎 Документация: https://gorm.io/docs/the_generics_way.html

Если ты пишешь на Go и используешь GORM — самое время перейти на новый стиль.
🚀 Кэширование в Go: как делать правильно

В свежей статье от Leapcell рассматриваются ключевые аспекты эффективного кэширования в Go:

- Планирование объёма памяти: важно заранее оценить, сколько данных будет кэшироваться, чтобы избежать переполнения памяти (OOM).

- Классификация данных: разделение данных на "горячие" и "холодные" помогает оптимизировать использование ресурсов, сохраняя часто используемые данные в быстром доступе, а редко используемые — на более экономичных носителях.

- Стратегии кэширования в распределённых системах:
- Использование распределённого кэша (например, Redis).
- Направление одинаковых запросов на один и тот же экземпляр приложения.
- Репликация кэша на каждом экземпляре приложения.

- Политики вытеснения: применение алгоритма LRU (Least Recently Used) помогает контролировать размер кэша, удаляя наименее используемые элементы.

Подробнее: https://dev.to/leapcell/caching-in-go-doing-it-right-25i5
🚀 Go — идеально подходит для AI-агентов

Агент дорогим в использовании (например, из-за использования LLM), и часто требует взаимодействия с пользователем или другими агентами.

⚙️ Преимущества Go для работы с агентами:
- Go позволяет запускать тысячи горутин с минимальными накладными расходами, что идеально подходит для масштабируемых агентных систем.

- Общение через каналы: Go поощряет передачу данных через каналы, что упрощает синхронизацию и уменьшает вероятность ошибок, связанных с общим доступом к памяти.

- Контекстное управление: Механизм context.Context в Go обеспечивает централизованное управление отменой операций, что особенно полезно для долгоживущих процессов.

- Богатая стандартная библиотека: Go предоставляет обширный набор инструментов для работы с сетью, JSON, криптографией и другими аспектами, необходимыми для разработки агентов.

- Профилирование: Инструменты, такие как pprof, позволяют эффективно отслеживать и устранять утечки памяти и горутин.

🙅 Минусы:
— Мало библиотек для ML
— Нет "магии" как у Python-экосистемы

Но если тебе важны надежность, скорость и контроль, Go — это отличный выбор 🔥

📖 Читать полностью
🌀 Middleware и RoundTripper в Go: гибкая обработка HTTP-запросов

В Go нет встроенного понятия "middleware", как в других фреймворках — но вы можете легко реализовать его сами, особенно в контексте http.RoundTripper.

🔧 RoundTripper — это интерфейс, который обрабатывает HTTP-запросы на уровне клиента (`http.Client`). Это даёт возможность внедрять логику *до* и *после* отправки запроса.

🧱 Пример: логгер запросов

type LoggingRoundTripper struct {
rt http.RoundTripper
}

func (l *LoggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
log.Printf("📤 Запрос: %s %s", req.Method, req.URL)
resp, err := l.rt.RoundTrip(req)
if err == nil {
log.Printf("📥 Ответ: %d", resp.StatusCode)
}
return resp, err
}


📦 Использование:

client := &http.Client{
Transport: &LoggingRoundTripper{rt: http.DefaultTransport},
}


💡 Таким образом, вы можете создавать middleware прямо внутри http.Client, например:
• логирование
• кэширование
• модификация заголовков
• retry-логика
• трейсинг

🔗 Подробнее: dev.to/calvinmclean/middleware-and-roundtrippers-in-go-30pa

#golang #httpclient #middleware #webdev #devtools
This media is not supported in your browser
VIEW IN TELEGRAM
Раньше: многоэтапные собеседования и тестовые
Сейчас: возможность получить оффер за один день!


Сбер зовёт Go-разработчиков на One Day Offer — он пройдёт 21 июня в онлайн-формате. Команда ищет будущих коллег в рекламную платформу SberAds сразу в несколько продуктов:

— Медийная реклама
— Performance Ads
— Инструменты разработки
— RTS

Регистрируйтесь на One Day Offer и будьте готовы к карьерным изменениям и работой над действительно масштабными задачами!
👣 Как работает разметка диска: парсим MBR и GPT на Go

Отличный технический гайд — как на языке Go реализовать свой инструмент для анализа разделов диска (аналог `fdisk -l`), работая напрямую с «сырыми» байтами.

📌 Что делает утилита:
• Считывает первые 512 байт с диска (MBR)
• Определяет тип таблицы разделов: MBR или GPT
• Парсит нужные структуры (MBRPartition, GPTHeader и др.)
• Выводит информацию о каждом разделе: смещение, размер, активность, тип, имя (для GPT)

🔧 Поддерживается два формата:
1. MBR (Master Boot Record)
• До 4 основных разделов
• Ограничение — 2 ТБ
• Таблица находится в первом секторе (512 байт)
• Каждая запись — 16 байт, с полями CHS, LBA, типом и флагами
• В конце сигнатура 0x55AA

2. GPT (GUID Partition Table)
• Современный стандарт с поддержкой >2 ТБ
• Использует специальные GUID-идентификаторы
• Поддерживает до 128 разделов
• Содержит основной и резервный заголовки + таблицу с метаданными и именами разделов в UTF‑16

📖 Примеры кода в Go:
• Структуры описаны через struct с бинарными полями
• Используется binary.Read для чтения блоков
• Есть вспомогательные функции для расшифровки типов и конвертации размеров

Выводит таблицу всех разделов, включая размер, активность, смещение и, при GPT, имя раздела.

💡 Почему это полезно:
• Позволяет лучше понять, как устроена разметка дисков
• Учит читать бинарные форматы и парсить их в Go
• Подходит для системного программирования, утилит, диагностики и низкоуровневой работы с железом

🧪 Автор также упоминает возможные улучшения:
• Проверка CRC
• Поддержка расширенных и логических разделов
• Чтение заголовков файловых систем
• Реализация в WebAssembly для запуска в браузере

📎 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Rust vs Go: Что выбрать в 2025 году

Пейзаж программирования продолжает развиваться: языки Rust и Go бросают вызов традиционным парадигмам и удовлетворяют высокие требования современности. Оба находят важные ниши благодаря эффективной работе на уровне системы и возможностям в конкуренции blog.jetbrains.com.

Согласно данным отчёта State of Developer Ecosystem за 2024 год, Rust установил рекорд популярности — 2,27 млн. пользователей, из которых 709 000 используют его как основной язык. Пользователей Go стабильно много, и каждый шестой сейчас задумывается о переходе на Rust blog.jetbrains.com.

Выбор между ними зависит от требований проекта — будь то производительность, удобство или конкуренция. Давайте разберём оба языка.

📌 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM