Telegram Group Search
🕰️ Подводные камни работы с пакетом `time` в Go

Пакет time в языке Go — мощный инструмент, но с рядом нюансов, которые важно понимать, особенно при разработке кросс-платформенного кода, тестировании производительности и работе с часовыми поясами. В статье ["Important Considerations When Using Go's Time Package"](https://dev.to/rezmoss/important-considerations-when-using-gos-time-package-910-3aim) автор выделяет ключевые моменты, на которые стоит обратить внимание каждому Go-разработчику.

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

Перейдём к основным идеям статьи:

- Монотонное время в Go
Go использует монотонные часы (monotonic time) при сравнении времён и вычислении интервалов. Это означает, что функции вроде time.Since(start) или time.Until(deadline) не зависят от текущего системного времени, что защищает от проблем при его изменении (например, если системное время изменилось вручную или произошло переключение на летнее/зимнее).

Однако есть нюанс: поддержка монотонного времени зависит от операционной системы. Например, на Windows поведение может отличаться от Linux. Кроме того, некоторые функции time.Time, особенно при сериализации (например, MarshalJSON`), не сохраняют информацию о монотонности. Поэтому нельзя полагаться на `time.Since() между разными экземплярами времени, сериализованными и десериализованными между процессами или машинами.

Точность ожиданий
Функции вроде time.Sleep или таймеры (`time.After`) не гарантируют точности в миллисекундах или тем более микросекундах. Если вам важно очень точное ожидание — например, в измерениях производительности — лучше использовать активное ожидание с проверкой времени, хоть это и более затратно для CPU:


deadline := time.Now().Add(1 * time.Millisecond)
for time.Now().Before(deadline) {
// активный busy-loop
}


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

Бенчмаркинг и измерения
Многие разработчики используют time.Now() для измерения производительности кода. Это ошибка. Вместо этого используйте пакет testing и его возможности Benchmark:


func BenchmarkMyFunc(b *testing.B) {
for i := 0; i < b.N; i++ {
MyFunc()
}
}


Go сам подберёт количество итераций и обеспечит надёжные измерения с учётом шумов и сборщика мусора.

Часовые пояса
В Go объект time.Time всегда содержит информацию о часовом поясе. Это важно! Не путайте:

- UTC() — время в UTC
- Local() — локальное системное время
- In(loc *time.Location) — преобразование времени в конкретную временную зону

Вы можете работать с временными зонами через файл zoneinfo, но будьте внимательны — не все контейнерные образы или минималистичные ОС содержат актуальные данные о временных зонах, и это может привести к неожиданным ошибкам.

Сравнение времён
При сравнении времён важно, чтобы они были приведены к одной временной зоне. Даже если два объекта time.Time представляют одинаковую точку во времени, но один — в UTC, а другой — в Local(), t1.Equal(t2) может вернуть false. Для сравнения используйте:


t1.UTC().Equal(t2.UTC())


Или используйте Sub() и Before/After — они учитывают монотонную часть и обычно безопаснее.

📌 Подробности
Пост об аудите криптографии Go от Trail of Bits

Статья на [go.dev](http://go.dev/blog/tob-crypto-audit) посвящена аудиту безопасности криптографических библиотек Go, проведенному Trail of Bits. Основные моменты:

🔐 Высокая надежность криптографии Go: Аудит подтвердил безопасность криптографических пакетов Go, которые отличаются строгим подходом к безопасности, минимальной сложностью кода и тщательным тестированием. Это обеспечивает защиту от уязвимостей, включая проблемы управления памятью, благодаря свойствам языка Go.

🛠 Единственная уязвимость: Обнаружена одна потенциально эксплуатируемая проблема (TOB-GOCL-3) низкой серьезности в экспериментальной интеграции Go+BoringCrypto, используемой только внутри Google. Уязвимость связана с управлением памятью и уже исправлена в Go 1.25. Она не затрагивает стандартные сборки Go, так как Go+BoringCrypto не включена по умолчанию.

🕒 Тайминговые атаки: Найдены незначительные риски тайминговых побочных каналов (TOB-GOCL-1, TOB-GOCL-2, TOB-GOCL-6). Только TOB-GOCL-2 затрагивает операции с секретными данными, но лишь на платформах Power ISA (ppc64, ppc64le). Все замечания исправлены в Go 1.25.

🔍 Дополнительные улучшения: Аудит выявил несколько информационных замечаний, включая потенциальные риски неправильного использования API (TOB-GOCL-4) и отсутствие проверки недостижимого лимита (TOB-GOCL-5). Эти рекомендации также учтены в разработке Go 1.25.

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

https://go.dev/blog/tob-crypto-audit

@golang_google
🚀 AЭРОДИСК ищет Golang-разработчика для разработки высокопроизводительных систем хранения данных!

Если ты хочешь:

— Разрабатывать и оптимизировать модули СХД на Go;
— Работать с блочными и файловыми хранилищами, повышая их производительность;
— Реализовывать репликацию, балансировку нагрузки и отказоустойчивость;
— Интегрироваться с Linux-системами и сетевыми стеками;
— Писать тесты и бенчмарки для оценки производительности;

📌 Что важно:
— Опыт разработки на Go от 2 лет;
— Глубокое понимание Linux, системных вызовов, работы с файловыми системами;
— Опыт работы с блочными устройствами, SCSI, NVMe, iSCSI, NFS, SMB;
— Знание распределённых систем и алгоритмов согласованности данных;
— Умение работать с сетевыми протоколами (TCP/IP, RDMA);
— Понимание принципов оптимизации ввода-вывода (IOPS, latency, throughput);

🕒 Все плюшки у нас: оформление по ТК РФ, социальный пакет с выбором льгот (ДМС, спорт, питание, обучение), оплата мобильной связи, внутренние тренинги, уютный офис в БЦ "Кругозор" (10 минут от м. Калужская), корпоративные мероприятия, зона отдыха с аэрохоккеем и настольным футболом.

👉 Больше деталей и отклик на hh.ru

Разработка, где скучно точно не будет.

Реклама. ООО "АЕРО ДИСК". ИНН 7731475010. erid: 2W5zFHN7k48
👣 Stateless Postgres Query Router — это система шардирования для PostgreSQL-кластера, доступная с открытым исходным кодом. Её основной компонент, роутер, анализирует запросы и определяет, на каком конкретном PostgreSQL-кластере следует выполнить транзакцию или запрос.

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

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

Исходный код SPQR распространяется под лицензией PostgreSQL Global Development Group

⚡️ Ссылки:
🟢https://github.com/pg-sharding/spqr
🟢https://pg-sharding.tech/

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Тест для Golang-разработчиков, проверьте свои знания, готовы ли вы к обучению на курсе.

💻 Ответьте на 20 вопросов за 30 минут и проверьте, готовы ли вы к обучению на онлайн-курсе «Golang Developer. Professional» от OTUS. Сейчас Go становится все востребованнее, благодаря своей производительности, масштабируемости и экосистеме.

После 5 месяцев обучения вы сможете:

— Писать production-ready код, многопоточные и конкурентные программы.

— Понимать синтаксис и внутреннее устройство языка Go.

— Разворачивать микросервисы с помощью Docker.

— Проектировать и реализовывать микросервисную архитектуру на Go.

Также вас ждет прокачка навыков на реальных коммерческих кейсах и под руководством экспертов в этой области. Возможна рассрочка.

👉 ПРОЙТИ ТЕСТ

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
🕊️ RoadRunner — высокопроизводительный application server на Go. Этот проект заменяет связку Nginx+PHP-FPM, позволяя запускать PSR-7-совместимые приложения с поддержкой HTTP/3, WebSockets и даже Temporal workflow.

Конфигурация через .rr.yaml напоминает docker-compose: можно подключать очереди, кеш и метрики как плагины. Рабочие процессы PHP остаются в памяти, что даёт до 10x прирост скорости против традиционного FPM. Особенно радует встроенная система мониторинга и автоматические рестарты упавших воркеров.

🤖 GitHub

@golang_google
Go-митап с инженерами МТС Web Services

10 июня в Екатеринбурге пройдёт технический митап Go Up от MWS для Go-разработчиков.
Спикеры:
• Эмиль Ибрагимов — о генерации CLI из OpenAPI
• Валерий Локтаев — об автоматизации Terraform
• Георгий Фатеев — о безопасности Go-кода


Этот митап — классная возможность узнать, как строится облачная платформа изнутри, и задать вопросы топовым инженерам в неформальной обстановке. Go Up to the Cloud!

Музей истории Екатеринбурга, 18:00. Регистрация
👣 FFmate — умная автоматизация на базе FFmpeg

FFmate — это современный и мощный уровень автоматизации поверх FFmpeg. Он упрощает работу с видео и аудио, превращая хаос транскодирования в чистые, надёжные потоки обработки :contentReference[oaicite:0]{index=0}.

Ключевые возможности

- REST API — программно отправлять и управлять задачами
- Веб-интерфейс — мониторинг и контроль без командной строки
- Watchfolders — автоматически обрабатывать файлы, появившиеся в папке
- Presets — готовые настройки для типичных задач
- Webhooks — уведомления о событиях задач
- Wildcards — универсальные шаблоны для именования и папок
- Hooks pre/post-processing — запуск скриптов до и после задач
- Встроенная очередь — управление приоритетами и параллельностью :contentReference[oaicite:1]{index=1}

Примеры применения

- Автоматическое преобразование видео, извлечение аудио и создание превью
- Постпродакшн-пайплайны и медиа-публикации
- Интеграция с MAM-системами через вебхуки
- Централизованное API-first управление задачами FFmpeg
- Обработка файлов из папки (например, камеры) — всё без ручного запуска :contentReference[oaicite:2]{index=2}

🛠 Архитектура и запуск

FFmate написан на Go, распространяется под лицензией SSPL. В репозитории есть:
- Клиент и сервер (REST API + Web UI)
- Dockerfile и шаблоны для сборки
- Документация и примеры в docs/ :contentReference[oaicite:3]{index=3}

📣 Мнение сообщества

Из обсуждений на Reddit:
> “If you've ever struggled with managing multiple FFmpeg jobs, messy filenames, or automating transcoding tasks, FFmate might be just what you need.” :contentReference[oaicite:4]{index=4}

Это резюмирует суть — упростить задачу массового и автоматизированного транскодирования.

🔗 Полезные ссылки

- GitHub: https://github.com/welovemedia/ffmate
- Документация: https://docs.ffmate.io

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Бросить монады и обнять if err != nil...

Эта статья — не туториал, а исповедь скалиста-функциональщика, который ушёл в Go… Рассказ для тех, кто любит абстракции, но устал от них. И тех, кто хочет писать просто и по делу.

Читается на одном дыхании:  https://tglink.io/d05ced5c71d5?erid=2W5zFHrYxZW
🛠️ История создания “storage-agnostic” message queue

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

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


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

🧱 Как это реализовано в VarMQ

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

Теперь воркер просто берёт задачи из очереди, не зная, где они хранятся.

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

• 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)


В итоге воркер обрабатывает задачи одинаково — независимо от хранилища.

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

• Гибкость: адаптеры позволяют легко менять хранилище без правок воркера
• Минимальные зависимости: в яд

📌 Читать
Хотите присоединиться к проекту с многомиллионной аудиторией? 😎

1️⃣ В продукт, внутренний мессенджер компании, базирующийся на Mattermost, требуется разработчик:

Go-разработчик в команду внутренних проектов

Планы по продукту предусматривают как разработку пользовательского функционала (ремайндеры, отложенные сообщения и т. п.), так и фундаментальные изменения, рефакторинг крупных подсистем.

2️⃣ Также требуется специалист в департамент Tech Platform, который займётся поддержкой инфраструктуры, ускорит доставку в продакшн и уменьшит рутину при написании кода:

Бэкенд-разработчик в команду Platform X (IDP)

Ваша команда будет отвечать за пользовательский опыт взаимодействия с платформой и давать другим командам инструменты для создания UI в рамках своей зоны ответственности.

А ещё вас ждёт:

- возможность реализовать свои идеи в проекте с многомиллионной аудиторией
- талантливая команда, готовая поддержать ваши инициативы
- мощное железо, дополнительные мониторы и всё, что нужно для продуктивной работы
- прозрачная система премий, достойная зарплата — размер обсудим на собеседовании
- личный бюджет на обучение, который можно тратить на книги, курсы и конференции
- забота о здоровье: с первого дня у вас будет ДМС со стоматологией, в офисе принимают терапевт и массажист
- удалёнка или комфортный офис в двух минутах от метро «Белорусская»: панорамный вид на центр города, места для уединённой работы и зоны отдыха.

Откликайтесь!
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️ OneUptime — open-source-платформа для мониторинга всего и сразу. Этот инструмент предлагает готовый комплект: от мониторинга uptime до управления инцидентами. Редкий случай, когда open-source-проект не уступает коммерческим аналогам по функционалу.

Особенность проекта в глубокой интеграция компонентов. Например, при падении сервиса система автоматически создаёт инцидент, уведомляет ответственных через эскалацию и обновляет статус-страницу. Есть даже встроенный APM с трейсами и метриками производительности. Развернуть можно на Kubernetes или через Docker Compose.

🤖 GitHub

@golang_google
🧪 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/

@golang_google
🚀 Go — лучший старт для вашей карьеры в программировании. 

🔎 Если вы хотите освоить один из самых востребованных языков разработки, не тратя времени на сложный синтаксис, Go — ваш идеальный выбор. Курс «Golang Developer. Basic» от OTUS — это возможность начать с нуля и научиться создавать эффективные приложения, веб-сервисы и системы.

Что вас ждёт:

— Легкость изучения и быстрая адаптация в Go.

— Применение best practices и реальных инструментов разработки.

— Основы разработки на Go и эффективное использование встроенных инструментов.

📖 Программа обновляется в соответствии с требованиями рынка. Диплом OTUS ценят ведущие IT-компании. Обучение ведут опытные преподаватели, работающие в реальных проектах.

😎 Старт курса — 29 мая.

🔴 Набор почти закрыт! Оставьте заявку и получите скидку на обучение: https://otus.pw/hfjK9/?erid=2W5zFGZLmRA

Скидка 5% по промокоду: Go_05

Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
📦 Как оптимизировать struct в Go: выравнивание, паддинг и порядок полей

Когда ты работаешь с Go и структурой данных (`struct`), порядок полей — это не просто эстетика. Это напрямую влияет на:
• размер занимаемой памяти
• эффективность использования кэша
• и в итоге — на производительность твоей программы.

Автор [buarki на DEV.to](https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1) показывает, как правильно выстраивать поля в структурах, чтобы избежать лишнего паддинга и сделать struct более компактным и быстрым.

🔍 Что такое padding?

Go автоматически выравнивает поля структур по их размеру. Например:

type Bad struct {
a bool // 1 байт
b int64 // 8 байт
c bool // 1 байт
}

Кажется, что struct должен занимать 10 байт. Но из-за выравнивания Go вставит паддинг, и итоговый размер окажется 24 байта.

Как это исправить?

Меняем порядок полей:

type Good struct {
b int64 // 8 байт
a bool // 1 байт
c bool // 1 байт
}

Теперь структура занимает 16 байт, а не 24 — и всё благодаря грамотному размещению полей.

📌 Рекомендации:

• Сортируй поля от самых крупных к самым мелким
• Группируй однотипные поля
• Избегай перемешивания bool`/`byte с int64`/`float64
• Используй визуализацию (например, viztruct) для анализа struct'ов
• Проверяй размер struct через unsafe.Sizeof()

🎯 Это особенно важно при:
• массовом использовании struct в массивах и слайсах
• передаче struct между потоками
• работе с бинарными протоколами или mmap

📖 Подробнее с примерами: https://dev.to/buarki/optimizing-struct-layout-and-padding-in-practice-23p1
Почему мы решили писать собственный Object Storage для новой платформы MWS?

🔗Рассказываем в статье в хабе DevCloud от MWS на Хабр

Вы узнаете:
⏺️Почему нам не подошли даже зрелые решения вроде Ceph RGW
⏺️С какими техническими ограничениями и компромиссами мы столкнулись при оценке альтернатив
⏺️Как устроено наше собственное S3-совместимое хранилище — и зачем мы вообще его делаем
⏺️Как архитектура с Golang, PostgreSQL и Kafka даёт гибкость и масштабируемость

⏩️Подписаться на хаб
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Как предотвратить "молчаливую смерть" горутин в Go?

В статье рассматривается, как реализовать механизм "сердцебиения" (heartbeat) для горутин в Go, чтобы отслеживать их активность и своевременно обнаруживать сбои.

🔍 Зачем нужны heartbeats?
Иногда горутина может завершиться неожиданно без явных ошибок или логов, что затрудняет диагностику. Механизм heartbeats позволяет периодически отправлять сигналы о том, что горутина все еще работает, даже если она ожидает задания. Это особенно полезно для:

Мониторинга состояния фоновых задач

Обнаружения и перезапуска "зависших" горутин

Улучшения надежности и отказоустойчивости систем

🛠 Как это реализовать?
Используя time.Ticker, можно настроить горутину на периодическую отправку сигналов активности через канал. Пример функции dowork:


func dowork(done <-chan interface{}, pulseInterval time.Duration) (<-chan interface{}, <-chan struct{}) {
heartbeater := make(chan interface{})
result := make(chan struct{})
go func() {
defer close(result)
defer close(heartbeater)

pulse := time.NewTicker(pulseInterval)
workGen := time.NewTicker(3 * pulseInterval)

defer pulse.Stop()
defer workGen.Stop()

sendPulse := func() {
select {
case heartbeater <- struct{}{}:
default:
// если никто не слушает, пропускаем
}
}

sendResult := func(res struct{}) {
for {
select {
case <-done:
return
case <-pulse.C:
sendPulse()
case result <- res:
return
}
}
}

for {
select {
case <-done:
return
case <-pulse.C:
sendPulse()
case <-workGen.C:
sendResult(struct{}{})
}
}
}()
return heartbeater, result
}


🧪 А в main можно следить за этим:


for {
select {
case <-heartbeat:
log.Println("Still alive")
case <-time.After(5 * time.Second):
log.Println("Timeout! Goroutine might be dead")
}
}
}()


🎯 Зачем это нужно:
• Обнаружение зависших/умерших горутин
• Реализация watchdog'ов
• Надежность фоновых процессов в проде

🔗 Статья: https://blog.devgenius.io/how-to-build-heartbeats-in-go-let-your-goroutines-say-still-breathing-d047253d5c78

@golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
ХОЧЕШЬ ПОВЫСИТЬ ГРЕЙД В 2025 ГОДУ? 🚀

Если:
— код разваливается от правок,
— бизнес-логика размазана,
— Entity — просто структуры,
— а тесты живут своей жизнью —
вам точно сюда.

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

🔹 Как проходит обучение?

Практика на реальном кейсе
Вы разработаете сервис диспетчеризации заказов, решая реальные бизнес-задачи.

Видеоуроки в удобное время
Эксперт шаг за шагом создаст микросервис «Корзина», раскрывая ключевые паттерны DDD.

Чат с экспертом
Не останетесь без ответов – задавайте вопросы в закрытом чате и получайте разбор сложных тем.

Персональная обратная связь
Куратор проведет ревью кода, даст рекомендации и поможет разобраться с архитектурными решениями.

Вебинары с разбором ДЗ
Эксперт ответит на вопросы, объяснит сложные темы и поможет глубже понять материал.

Программа курса включает:
🔸 Разбор всех паттернов DDD
🔸 Value Object, Entity, Aggregate, Domain Service
🔸 Repository, Application Layer, HTTP/gRPC адаптеры
🔸 Kafka: входящие и исходящие адаптеры
🔸 Eventual Consistency, Outbox, Polling Publisher

📢 Записывайтесь сейчас и станьте экспертом в DDD и Clean Architecture на Go! 👉 https://microarch.ru/courses/ddd/languages/go?utm_source=posev&utm_medium=erid:2VtzqvFWyBX&utm_campaign=4

Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqvFWyBX
🗃️ Stoolap — лёгкая и быстрая SQL-база данных на чистом Go без зависимостей

Stoolap — это современный HTAP-движок (Hybrid Transactional/Analytical Processing), сочетающий OLTP и OLAP в одном ядре. Подходит как для транзакционных задач, так и для аналитики.

🚀 Возможности:
• Полностью написан на Go — никаких внешних зависимостей
• ACID-транзакции через MVCC
• Колонковое хранение с SIMD-ускорением
• Поддержка SQL: JOIN, агрегаты, оконные функции
• Встроенный тип JSON
• Поддержка database/sql и интеграция с GORM
• CLI-режим и in-memory база

📦 Установка:

go get github.com/stoolap/stoolap


🔥 Быстрый старт (CLI):

stoolap -db memory://


📎 Репозиторий: https://github.com/stoolap/stoolap
🌐 Сайт: https://stoolap.io


@golang_google
🧃 PDFJuicer — инструмент для извлечения структурированных данных из PDF

PDFJuicer — это open-source библиотека на Go , которая позволяет эффективно превращать PDF-файлы в удобные для анализа структурированные данные.

📦 Возможности

- 🔍 Извлекает логическую структуру документа: заголовки, абзацы, списки, таблицы
- 📄 Работает с текстовыми PDF (не использует OCR)
- 🔄 Возвращает результат в виде Go-структур (или HTML)
- ⚙️ Поддержка кастомных правил через juicer.yaml
- 🧪 Отлично подходит для научных статей, отчётов, юридических документов и не только

📦 Установка


git clone https://github.com/dmikhr/pdfjuicer.git


https://github.com/dmikhr/pdfjuicer

@golang_google
2025/05/30 06:35:15
Back to Top
HTML Embed Code: