Обновить
128K+

Go *

Компилируемый, многопоточный язык программирования

161,92
Рейтинг
Сначала показывать
Порог рейтинга

Фронтенд для души, бэкенд для людей!

Мастер по разводу холивар
Мастер по разводу холивар

Были приняты меры погрузиться под воду дабы показать серьезность моих намерений в данной щепетильной теме.

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

Бэкенд наоборот поддерживает порядок и структурность. Меньше экспериментов и больше проверенных решений, самое то для "сделал работу - пошел спокойно домой".

Теги:
+2
Комментарии1

Вышел lazy-tmux 0.2.0!

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

Настройки наконец переехали в TOML-конфиг. Раньше приходилось прокидывать флаги каждый раз, теперь есть файл: config gen создаёт болванку, config show печатает итоговую конфигурацию с учётом всех источников. Заодно появился контроль над тем, что вообще перезапускается при восстановлении сессии — белый и чёрный списки, причём оба матчатся как регулярки по всей командной строке.

Сильно переработал сам TUI picker: нормальная тема, поддержка мыши, цветные режимы действий, панель хоткеев по ?, относительное время снапшота. Пока сессия поднимается, прямо внутри picker’а теперь рисуется анимация загрузки, а Esc аккуратно отменяет восстановление и убивает частично поднятую сессию.

Ещё в релизе появился слой интеграций со сторонними программами, и первая из них — Claude Code. Рядом с каждой сессией в picker’е показывается живой статус: работает, ждёт вашего ответа или подтверждения, либо просто простаивает. Когда крутишь несколько агентов по разным проектам, удобно видеть, кто из них заблокирован, не переключаясь внутрь каждого. А восстановленные окна Claude сами переподхватывают свою сессию.

Из остального: проверил совместимость с tmux от 2.9 до 3.7b, починил поведение когда сервер tmux вообще не запущен, добавил фоновый демон автосейва, команду version и обновил сайт документации.

Поставить можно одной строкой:

curl -fsSL https://lazy-tmux.xyz/install.sh | sh

Есть и Homebrew с AUR. Код — https://github.com/alchemmist/lazy-tmux, документация — https://lazy-tmux.xyz. Проект ещё молодой, открытых задач хватает, так что буду рад фидбэку и контрибьюшенам!

Теги:
+3
Комментарии0

Вышел Echo 5.3

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

Echo построен на основе net/http и работает с ним через echo.WrapHandler / echo.WrapMiddleware, добавляя компоненты, которые стандартная библиотека оставляет разработчику: быстрый маршрутизатор на основе дерева решений, привязка запросов (с подключаемым валидатором), развитую экосистему middleware и централизованную обработку ошибок.

Ключевые новинки версии 5.3:

  • Добавлена ​​полноценная поддержка метода HTTP QUERY в соот с RFC 10008

  • Маршрутизатор: автоматическая обработка HEAD-запросов обработчиками GET

  • Изменение логики группировки middleware

GitHub: https://github.com/labstack/echo

ChangeLog: https://github.com/labstack/echo/releases/tag/v5.3.0

Теги:
+3
Комментарии0

Представлен открытый проект на Go под названием Castor. Умные ТВ не могут транслировать произвольное веб-видео, а зеркальное отображение экрана тормозит и теряет разрешение. Вместо этого Castor транслирует реальный поток в полном качестве с ПК на ТВ.

«Я создал Castor, потому что не мог транслировать веб‑видео со своего ноутбука на телевизор: не было Chromecast, не было AirPlay. Наведите его на любую веб‑страницу, и Castor найдет видео, извлечет поток, перекодирует его для вашего телевизора и транслирует в реальном времени. Он также принимает прямой URL‑адрес потока или идентификатор IMDB/TMDB и может встраивать автоматически сгенерированные субтитры», — пояснил автор проекта.

Castor запускает Chrome в headless режиме с рандомизированным фингерпринтом и скрытыми скриптами для маскировки автоматизации. Решение отслеживает весь сетевой трафик через протокол Chrome DevTools для захвата видеопотока, а затем запускает короткий конвейер действий: кликнуть по странице, перейти в самый большой iframe, решить проблему с Cloudflare Turnstile, если таковая появится, и снова кликнуть в качестве резервного варианта.

Теги:
+9
Комментарии0

Обещанная статья про yggvault

Эта статья должна была выйти на Хабре ещё две недели назад. Но спасибо администрации Хабра за безвовзратное удаление самописной статьи: освободившееся время я потратил на финальное доведение проекта до ума. Исправил мелкие баги, улучшил документацию и так далее.

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

---

Что такое yggvault

yggvault — самостоятельное зеркало релизов и зависимостей, упакованное в один бинарный файл.

Оно забирает выбранные версии проектов с GitHub, GitLab, Bitbucket, Gitea или другого узла yggvault, проверяет их, сохраняет локально и публикует сразу в нескольких форматах.

Один процесс предоставляет:

  • совместимые с GOPROXY маршруты для Go-модулей;

  • репозиторий Composer v2;

  • исходные архивы .zip и .tar.gz;

  • JSON API и OpenAPI;

  • Atom-ленты обновлений;

  • веб-интерфейс с каталогом, версиями, хешами, командами установки и ссылками на архивы.

Вся фишка в том что внешняя база данных, JVM и тд не нужны. Данные хранятся локально, а уже загруженные версии продолжают раздаваться, даже если исходный forge временно недоступен, заблокирован или упёрся в rate limit.

Зеркало можно поднять локально, на VPS или в домашней сети. Дополнительно yggvault умеет работать внутри сети Yggdrasil — без публичного IP, DNS, проброса портов, root-доступа и отдельного системного демона. (Еще одна причина для статьи — популяризация Yggdrasil)

Несколько узлов могут использовать друг друга как доверенные «братские» зеркала и синхронизировать релизы через обычный Web или Yggdrasil.

Проект не пытается быть полным реестром всех пакетов или прозрачным прокси для всего Go. Его задача проще: надёжно хранить и раздавать выбранные зависимости через контролируемую вами точку.

Репозиторий:
https://github.com/voluminor/yggvault

Работающее публичное зеркало:
https://www.ratatoskr.space/pkg/

Полная статья и технические заметки:
https://hackaday.io/project/206175-yggvault-mirror-your-dependencies-in-one-binary

Теги:
+8
Комментарии0

Волею судеб я занимаюсь престранными вещами, вроде написания Go бэкэнда под Windows. С опцией переноса его в Linux контейнер. Можно было бы сразу разрабатывать под контейнер, но на моей рабочей машине недостаточно оперативки для комфортной разработки.

Мой бэкэнд реализует ряд REST API функций и начинает свою работу с ловли входящих соединений на порту. Для этого я использовал net.Listener, который как выяснилось испытывает сложности с повторным захватом порта, а SO_REUSEADDR, который прекрасно работает в С++ в Go работает, как-то, не очень. Автоматический запуск приводил к порождению бесконечного числа процессов, которые только писали в лог ошибки безо всякой полезной деятельности. И когда мне надоело заставлять это работать я решил использовать старый и проверенный метод: сделать так, чтобы бэкэнд запускался по каждому порту один раз. Оставим в стороне неинтересные подробности того как связывать процессы с конечными точками (endpoints).

И всё было прекрасно до тех пор, пока я не добрался до того, что os.FindProcess() всегда находит процесс. Даже если процесс уже завершился. В случае запуска на POSIX системе можно было бы использовать process.Kill(0), но на моём Windows 11 это не работает. И, в условно переносимом коде появилась ветка для Windows:

var perr *os.SyscallError if runtime.GOOS == "windows" && errors.As(errKill, &perr) && errors.Is(perr.Err, syscall.ERROR_ACCESS_DENIED) {
log.Warnf("unable to kill dead process: %d. Error: %v", pid, perr)
} else {
log.Warnf("unable to kill process: %d. Error: %v", pid, errKill)
return errors.New("previous process running")
}

А морали в данном посте не будет. Для меня это сильно похоже на Python, где я также делил код на Windows и POSIX. Вполне вероятно, что я просто не знаю простого и лёгкого способа добиться необходимого мне поведения.

Теги:
+4
Комментарии9

Привет. Я пишу бэкенд на Go, люблю строгую типизацию и предсказуемость. Но игнорировать тему ИИ-ассистентов глупо, поэтому я решил проверить, насколько они применимы для сборки нормального, защищенного проекта, а не просто кривых прототипов.

Чтобы эксперимент был чистым, взял стек, с которым не работаю каждый день: Node.js (Express 5) и Vanilla JS. На выходе получился хаб с утилитами: https://toolkitch.ru/

Главная идея проекта - простые инструменты средствами компьютера. Меня всегда раздражало, что популярные онлайн-сервисы гоняют данные на свои сервера, хотя по факту это может выполняться на компьютере. Здесь инструменты работают строго client-side, то есть в браузере пользователя. Ничего не устанавливал и не скачивал, но выполнил на компьютере.

По технической части:

  • Express 5 и Bootstrap 5.

  • Безопасность: настроил Helmet, прописал строгие CSP заголовки и CORS.

  • Деплой: GitHub Actions -> Docker Hub -> docker-compose -> Traefik с авто-SSL.

Писать код помогал ИИ-ассистент KodaCode. Впечатления положительные: нейронка полностью сняла с меня рутину вроде написания докер-файлов, конфигов Traefik и однотипной верстки под 7+ разных инструментов. Моя задача сводилась к контролю архитектуры и безопасности.

Сайт оптимизировал в том числе под ИИ-поисковики (GEO/AEO), чтобы тот же Яндекс Нейро или Perplexity могли индексировать страницы и предлагать эти утилиты пользователям по прямым запросам.

Посмотреть, что получилось, можно по ссылке выше. Будет интересно узнать, как вы используете ИИ в своей инженерной рутине, и какие специализированные плагины/инструменты можете порекомендовать. За критику по UI/UX сайта также буду благодарен.

Теги:
+6
Комментарии1

Язык, с которым у ИИ плохо

В подкасте Радио-Т 1018 был интересный момент, что у ИИ сейчас гораздо меньше опенсорсных репозиториев и датасетов на Swift, чем условно на Python или Go. И поэтому, как Claude Code, так и Codex хреново пишут нативные iOS приложения. А ведь API языка обновляется, имеющиеся данные в нейронках устаревают с каждым WWDC.

Я как бэкендер с этой темой не сталкиваюсь. Стало интересно, как в Apple вайбкодят разрабы и влияет ли это как-то на темпы разработки по сравнению с конкурентами. Apple Intelligence пока пытались запустить для обычных потребителей, или когда анонсировали переход на Gemini-бэкенд, это повлияло как-то на пайплайн разработчиков? Есть ли у их моделей какой-то секретный проприетарный датасет, чтобы повысить качество работы с их экосистемой?

Мне короткий гуглеж выдал, что анонсировался Swift Assist в 2024, но в 2025 году от него отказались в пользу доступа к любым моделям с помощью API-ключей. То есть сама компания не может предоставить продакшн тулинг за счет доступа к самому большому в мире закрытому репозиторию Swift-кода. Получается, Apple со своей закрытой инфраструктурой не может оставаться верной своей концепции. В эпоху агентской разработки у компании не получается замыкать на своем решении инженеров, чтобы не уступать конкурентам.

Тут у меня котелок начал накидывать вопросы.

Apple ладно, а какое будущее у новых языков программирования? Будут ли авторы новых языков задаваться вопросом «как мой язык будут поддерживать нейросети?» Их популяризация будет целиком и полностью за счет опен-сорс коммьюнити теперь, пока остальные языки будут писать агенты? Сообщества сами генерят синтетические данные для языков программирования, чтобы локальные модели лучше умели в определенный скилл? Или может для языков будут сразу разрабатываться скиллы или MCP? Какую роль в адаптации к агентсткой разработке будут играть компилируемые языки со строгой типизацией по сравнению с нестрогими, скриптовыми языками? А поддержка нового языка агентами на сносном уровне, - это повод для флекса в презентации у компании?

В интересное время живем.

Теги:
Всего голосов 3: ↑3 и ↓0+5
Комментарии8

Представлен открытый проект Navidrome Music Server, который позволяет слушать музыку с ПК где угодно. Работает очень просто: пользовательский ПК превращается в сервер, к которому можно получить доступ с любого устройства. Есть демо-версия проекта, чтобы понять принцип работы.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

На Go непривычно после Python

На работе переводим сервисы на Go. Делюсь ощущениями от Go, как FastAPI-питонист:

  • В Go классов нет, есть struct с полями.

  • Внутри структур нет методов. Перечислили поля и все. Дальше функцию связываем отдельно со структурой сигнатурой вида funс (s *SomeStruct) Greet () string {}. С аргументами читается еще тяжелее.

  • ООП нет, наследования нет. Связь между структурами через композицию.

  • Ошибки нужно обрабатывать руками без try ... except с помощью if err != nil {...}.

  • nil вместо None

  • Эксепшнов нет. Функции возвращают ошибку как обычное значение: val, err := SomeFunc(). Хотя в Python я ответ из кортежей прям не люблю и избегаю, тут это база.

  • Зато есть panic, которые по сути – необработанные эксепшны.

  • Но на паники есть recover, который лечит последствия паники :)

  • Комментарии через два слеша // comment

  • Докстринги над сигнатурами, а не под.

  • OpenaAPI для Swagger надо собирать самому без FastAPI. Напрочь забытый навык. Даже с либами вроде swaggo/swag делать это надо руками, с ошибками.

  • Валидации полей нужно писать руками. Нет аналога Pydantic с батарейками.

  • Строка в двойных кавычках "w" – строка. В одинарных 'w' – руна, другой тип данных, который принимает в себя только один символ. Писать слово или фразу в руну нельзя.

  • А есть еще backtick ` ` для тегов структур. В них как раз могут задаваться правила валидаций в go-playground/validator:
    type User struct {
    Name string `validate:"required,min=2"`
    }

  • len у строк в байтах. Символ в кириллице = 2 байта. len строки на кириллице ~х2, непривычно. Нужно считать длину рунами в строках.

  • Иинтерполяция делается через fmt.Printf(). В отличие от f-строк в Python требует в конце явного перевода строки с \n, иначе строки слипаются. 

  • Вместо snake_case – lowerCamelCase для приватных идентификаторов пакета, а UpperCamelCase для экспортируемых.

  • Первым аргументом в запускаемом приложении командой go run some-script.go неявно выступает путь до файла. Из-за этого появляются идиомы в циклах типо «начни со 2-го аргумента».

  • Моржовый оператор a := "some" в Go это инициализация переменной с присваиванием. В Python это оператор в if ... else блоках, который инициализирует переменную только если сработало условие.

  • Аргументы у методов – позиционные. DoSomething(first, second, last) против do_something(action=first, modifier=second, final_action=last) у Python. Python умеет в лаконичность, но тут Go в нее заставляет. У методов со сложными контрактами надо сигнатуру подсматривать.

Что в Go нравится:

Тут много наивного по неопытности :)

  • Горутины – топ. Не нужно в голове держать асинхронный код, потоки, процессы, футуры, CPU-задачи, IO-задачи – на все горутины. А для передачи данных – каналы. Горутины весят 2-4 КБ против ОС-потока в 2-4 МБ памяти. Нет танцев с GIL. go func и начинаешь в конкурентность.

  • Статическая типизация при сборке находит много ошибок без линтеров и mypy. Еще она заставляет явно писать типы данных в аргументах и ответах от функций. Код нагляднее.

  • Вместо двоеточий  и отступов фигурные скобки. Я еще с NodeJS любил не капризное авто-форматирование.

  • Go-скрипты собираются в бинарники. Для них не нужен установленный Python или JVM. Просто запускаем как обычный баш-скрипт через ./script

  • Импортировать пакеты нужно целиком. Как в Python только метод импортировать нельзя. Обязательная лаконичность тут нравится. Импорты аккуратные, а в коде вызов их функций более явный.

  • Код модулей удобно читать сверху вниз. Python – интерпретируемый. Все, что не объединено в класс, должно быть объявлено перед вызовом. Код приходится нередко читать снизу вверх. Go – компилируется, порядок кода неважен. Читать код по ходу пьесы проще.

  • Стандартный пакет для тестирования go test все умеет из коробки. Аналог pytest как внешняя зависимость не нужен.

  • Ради чего все это: перевод сервиса с Python на Go даже тупо с ИИ-агентом, по метрикам Prometheus (АБ 50/50 трафик) снизил время ответа и потребление CPU и IO-ресурсов в десятки раз.

Из-за последнего вас и спрашивают на Python-собесе «готов перейти на Go»? Бабки, с-ка, бабки.

Теги:
Всего голосов 7: ↑7 и ↓0+9
Комментарии5

Сегодня Go востребован для промышленной разработки бэкенда и микросервисов. Переход на него с Java или Python часто замедляется не из-за синтаксиса, а из-за незнания встроенных возможностей Go. Увидеть разницу можно на живых примерах одного и того же кода, который мы подробно обсудим 8 июня на бесплатном вебинаре «Go за час: почему вы перестанете писать на Java/Python».

За 60 минут разберём живое сравнение «как то же самое пишется на Python/Java и на Go», типичные ошибки перехода и встроенные инструменты из коробки — от автоформатирования и бенчмарков до кросс-компиляции одной командой. Все участники получат готовый план освоения языка до уровня Middle+ за четыре недели и поймут, как повысить свою рыночную стоимость с помощью современного инструмента для микросервисов и высоконагруженных систем.

На вебинаре:

✍️ Почему Go? Стоит ли в 2026 учить еще один язык?

✍️ Простота и ясность без классов и наследования.

✍️ Встроенная конкурентность. Горутины, каналы и мьютексы.

✍️ Инструменты из коробки. Разработка без тонны фреймворков.

✍️ Сборка и кросс-компиляция.

✍️Типичные проблемы. Игнорирование ошибок, гонки и при чем тут указатели?

📆 Когда: 8 июня, 17:00 — 18:00 (Мск)

👨‍🎓 Спикер: Власов Евгений — эксперт в области Backend-разработки, Golang, Python, архитектуры ПО.

👉 Записаться на вебинар👈

На вебинаре расскажем про ключевые отличия Go от привычных языков, а чтобы системно освоить промышленные инструменты рекомендуем курс «Golang-разработчик». Программа ориентирована на формирование навыков, необходимых для промышленной разработки на Go: асинхронная коммуникация через очереди сообщений, тестирование, профилирование (pprof) и трейсинг (OpenTelemetry/Jaeger). Старт: 16 июня. Места ещё есть.

👉Записаться на курс👈

Теги:
Всего голосов 2: ↑1 и ↓1+2
Комментарии0

🚀 Golang Roadmap 2026 — полная карта обучения на русском языке

Это бесплатный open-source roadmap на русском языке. Внутри — 19 модулей, каждый со своей теорией, практикой, бесплатными ресурсами и финальным проектом. Программа собрана так, чтобы провести вас от полного нуля до уровня Senior/Staff Go Engineer за 12–18 месяцев при темпе 10–15 часов в неделю.

Главный принцип обучения - практика > видосы. Каждую тему вы закрываете кодом: пишете, ломаете, чините, рефакторите. Любой модуль завершается мини-проектом, который можно положить в портфолио.

🎯 Кому подойдёт

🐹 Новичкам в Go — даже если до этого писали только на Python/JS/PHP

🛠 Backend-разработчикам с другого стека — хотите перейти на Go

📈 Junior Go-разработчикам — нужен путь до Middle/Senior

🚀 Middle-инженерам — закрыть пробелы в архитектуре, observability, distributed

🤖 Тем, кто хочет писать AI-инфраструктуру — модуль 18 специально про это

https://github.com/Develp10/golangroadmap2026

Теги:
Всего голосов 2: ↑1 и ↓10
Комментарии0

Вы попали в следующую ситуацию: граница, проверка, оператор просит разблокировать телефон. Отказаться нельзя или невыгодно. Что можно?

Стандартные ответы у мессенджеров слабые. Обычный app-lock PIN открывает то же приложение, под принуждением бесполезен. «Удалить аккаунт по PIN» лучше, но видно что что-то стёрто. Облачные TTL текущий запрос не закрывают.

В RCQ сделали по-другому. Локальная история шифруется AES-256-GCM, ключ выводится из PIN’а через PBKDF2-HMAC-SHA256 на 400к раундов с per-install salt в keychain. Разные PIN’ы открывают разные хранилища.

400к раундов это около секунды CPU на iPhone, достаточно медленно чтобы offline-bruteforce был дорогой. Но реальная защита это длина PIN’а: 4-значный перебирается за десятки минут на M-чипе, 8-значный за месяцы. Default 6-8 символов.

Четыре режима

  1. Real PIN - открывает реальный аккаунт.

  2. Decoy PIN - открывает отдельный аккаунт с собственным UIN и SQLite. Не пустой экран (пустой это сигнал), а правдоподобно освоенный: пара контактов, несколько сообщений.

  3. Wipe PIN - тихо стирает оба SQLite, чистит keychain, дёргает DELETE /auth/account. Без подтверждений и прогресс-баров. Через 3 секунды приложение перезапускается как свежеустановленное.

  4. Biometric - опциональная вторая дверь к real. Не совмещается с decoy/wipe (скорее для удобства).

Честно про границы

Защищает от: казуального осмотра, принуждённой разблокировки, ситуации «5 секунд до того как заберут».

Не защищает от: forensic-лаб с offline-bruteforce’ом короткого PIN’а, jailbroken устройства с активным debugger’ом, человека рядом который видел как вы вводите PIN (разумеется).

Threat model правильный: «есть несколько секунд до того как кто-то откроет приложение, дальше я не контролирую устройство». Для «forensic с неограниченным временем» нужны другие инструменты. Главное из них: не пользоваться телефоном для чувствительных переписок вообще.

Стек живёт в RCQ, открытая бета на iOS. Код открытый: github.com/rcq-messenger/rcq-ios. Про маскировку самого факта установки приложения будет отдельно.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии11

Ближайшие события

Открытый проект Go Interview Practice содержит обширный репозиторий для подготовки к собеседованиям на Go:

  • внутри — целая интерактивная платформа с задачами всех уровней. Могут готовиться как новички, так и профи.

  • ИИ‑интервьюер проверяет решения и сразу дает подсказки.

  • есть таблица лидеров, чтобы соревноваться с топами и видеть свой прогресс.

  • можно задать вопросы коммьюнити, если задача оказалась слишком трудной.

Теги:
Всего голосов 5: ↑5 и ↓0+5
Комментарии0

Как можно ошибиться при обработке ошибок в Go

Tе, кто до Go писал на языках с конструкциями try/catch, таких как Java и C#, наверняка испытывают легкое замешательство. Руки так и тянутся к try/catch заменителю — использованию recover в связке с defer — как к самому очевидному аналогу. Но это плохая практика и так делать не стоит. Давайте разберёмся, почему и как можно ошибиться при обработке ошибок в Go.

Теги:
Всего голосов 4: ↑4 и ↓0+5
Комментарии1

Сбалансированные Claude Code Safety Hooks с минимум false positive благодаря AST-парсингу Bash

Наконец-то сделал хуки моей мечты - достаточно безопасные и практически без false-positive. Хуки вымученные, эволюционировали на граблях можно сказать.

Собственноно, любой, кто проработал с агентами какое-то время отлично знает, что иногда они чудят, удаляя лишнее - папки, докер образы или даже целые базы вместе с инфрой. И их важно вовремя ловить за руку.
Хуки - это важнейшая часть работы с AI-кодинг агентами, привносящая в них не только детерменированности, но и безопасности.

Соответственно, когда хуков нет совсем или их мало, безопасность хромает - агент может уронить базу, сделать rm rf и тд, а если хуков слишком много , то... вы привыкаете клацать Enter на Allow, уже даже не читая о чем вообще сыр-бор. Поэтому, нужен тонкий баланс и хуками важно закрывать только действительно деструктивные, необратимые или критические действия.

Ну, и сразу второй нюанс - для блоков я предпочитаю использовать ask хуки вместо блокирующих, т. к. агенты нынче слишком умные и получив блокирующий хук, наверняка найдет способ обойти ограничение (особенно если прилетел какой-нибудь prompt-injection), тк хуки обычно весьма примитивны.

Короче-говоря, с учетом всех этих нюансов я написал свои opiniated-хуки, которые сам использую, они максимально сбалансированны по allow/ask с практически нулевым false positive - благодаря парсингу AST, а не regex'ам, которые обычно в хуках. Частично в основе лежит claude-code-safety-net весьма сильно переработанный и дополненный.

Внутри:
1. rmrm/unlink/shred вне cwd, по /etc, $HOME; через sudo, xargs, find -delete, pipe-to-shell.
2. infrakubectl, docker, terraform, helm, gcp.
3. dbDROP/TRUNCATE/DELETE через psql/mysql; redis-cli FLUSHALL/SHUTDOWN, supabase.
4. paas — Railway, Fly, Heroku, Vercel, Netlify с destructive-глаголами (PocketOS-класс).
5. gitreset --hard, clean -fd, checkout . / restore ., branch -D, stash drop/clear, push -f, push --delete.

Ссылка на репо: https://github.com/CodeAlive-AI/ai-driven-development/tree/main/hooks/balanced-safety-hooks

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

Кстати, для простого и корректного управления своими хуками у меня есть отдельный скилл hooks-management, который теперь поддерживает Claude Code, Codex и OpenCode.

Если вам нравится такой контент, то не премините заглянуть в мой Telegram канал, в котором я регулярно делюсь всякими полезностями про AI-Driven Development: https://t.me/+A-CrVovS0lczMDVi

Теги:
Всего голосов 3: ↑2 и ↓1+1
Комментарии0

Сделал необычную RTS на Ludum Dare 59 за пару дней

Выглядит примерно так
Выглядит примерно так

Игра написана на Go (Ebitengine), исходники на есть гитхабе.

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

Я накидал небольшой шаблон для игр на стеке своих геймдев-библиотек. Его можно посмотреть тут: https://github.com/quasilyte/gscene-game-template.

С этим шаблоном старт начала работы над игровой логикой и "мясом" игры становится ближе. Это позволяет +/- выйти на удобство какого-нибудь Godot, где не нужно первые несколько часов настраивать как у нас обрабатывается input, звук и сцены. Я этот шаблон буду дорабатывать по мере участия в джемах, за каждую мини-игру у меня копится TODO на то, что еще там можно было бы улучшить.

Если тема разработки игр на Go вам интересна, заходите в наше русскоязычное сообщество в телеграме. Мы там обсуждаем всякие библиотеки для геймдева, свои игры, и всё такое.

Кстати, ребята из чатика тоже сделали свои игры на Ebitengine, вот они:

Теги:
Всего голосов 7: ↑7 и ↓0+8
Комментарии15

lazy-tmux — быстрый и «ленивый» менеджер сессий tmux

Весь мой рабочий процесс происходит внутри сессий tmux. Долгое время я использовал tmux-resurrect + tmux-continuum. Они работали… но с нюансами. Иногда терялись все сохранённые сессии, а при множестве активных сессий всё оставалось загружено в память, в частности, запущенные nvim процессы, которые поднимаю lsp, что со временем отъедало все больше и больше ОЗУ.

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

Так родился lazy-tmux, написанный на Go. Ключевые фичи:

  • Сохраняет текущую сессию, конкретную сессию или все сессии целиком. Снимки сохраняют окна, панели, layout, команды (например, npm, docker-compose, редакторы) и опционально scrollback историю шела.

  • Ленивое восстановление: поднимается только выбранная сессия. RAM не расходуется на всё сразу.

  • Интерактивный TUI браузер с деревом сессий, окон и панелей, таблицей с активными командами, временем последнего снимка, количеством окон/панелей и статусом сессии. Поддержка fuzzy search для быстрого поиска.

  • Навигация и полное управление сессиями и окнами с клавиатуры в TUI браузере сессий.

  • Гибкая сортировка сессий и окон через флаги --session-sort и --window-sort

  • Можно заменить встроенный TUI на fzf, использую облегчённый бинарник.

  • Автосейв через фоновый демон, периодически снимающий все сессии на диск.

  • Восстановление при старте tmux для автоматизации workflow.

Проект ещё молодой, но буду рад любой помощи и идеям по улучшению: GitHub issues

За моими новостями можно следить в Telegram-канале

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

SIP-exporter: eBPF-мониторинг SIP-трафика для Prometheus

Хочу поделиться своим open-source проектом для мониторинга SIP-трафика — SIP-exporter. Это сервис, который использует eBPF для захвата пакетов прямо в ядре Linux и экспортирует метрики в Prometheus.

SIP-exporter — сервис, который захватывает SIP-пакеты (UDP/5060-5061) через eBPF socket filter, использует ringbuf для zero-copy передачи в userspace, парсит SIP в Go и экспортирует 40+ метрик в Prometheus, включает готовый дашборд для Grafana.

Архитектура: SIP Traffic → NIC → eBPF socket filter → ringbuf → Go poller → SIP parser → Prometheus

SIP-exporter экспортирует: активные SIP сессии (диалоги), SIP запросы по методам: INVITE, BYE, REGISTER, OPTIONS... SIP ответы по кодам: 1xx, 2xx, 4xx, 5xx, 6xx-, сессии.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

^ != <<

Знаете ли вы, что некоторые используют оператор '^' для возведения в степень? Хотя в ряде языков он действительно отвечает за возведение в степень, во многих популярных стеках разработки этот оператор выполняет операцию исключающего ИЛИ (XOR). Мы разберём, к каким последствиям приводит подобная путаница, и покажем реальный пример этой ошибки в механизме работы очереди внутри популярной библиотеки.

Теги:
Всего голосов 5: ↑5 и ↓0+6
Комментарии0

Китайские разработчики выпустили свой аналог OpenClaw, которому нужно всего 10 МБ ОЗУ. Легковесный проект PicoClaw:

  • полный контроль мессенджеров: ваш личный секретарь в Telegram и Discord, который реально разгребает завалы.

  • Deep Web Search: cёрфит по коду сайтов и выжимает только нужные данные без лишнего мусора.

  • поддерживает любые нейронки: GPT, Gemini, Claude.

  • манипуляция файлами: пишет, читает и правит конфиги на вашем диске прямо через консоль.

  • умеет мониторить новости, цены на товары и курсы валют по расписанию.

PicoClaw не требует огромных мощностей — ему нужно всего 10 МБ, а запускается он всего за 1 секунду.

Теги:
Всего голосов 4: ↑4 и ↓0+7
Комментарии1

Всем привет! Сделал Тетрис, в который можно играть в терминале. Получилось вполне залипательно)

Tetris
Tetris

Что умеет:

  • Все 7 фигур с wall kick при повороте

  • Превью следующей фигуры

  • Очки, линии, уровень

  • Скорость растёт с уровнем

  • Рекорд за сессию

  • Пауза, рестарт на ходу, экран game over

  • Центрируется в окне терминала

Видео геймплея
GitHub

Установка:

curl -sSL https://raw.githubusercontent.com/oakulikov/tetris/main/install.sh | bash

На Windows: открыть WSL/Ubuntu терминал и выполнить ту же команду.
Потом просто tetris.

Теги:
Всего голосов 9: ↑8 и ↓1+7
Комментарии5

Go vet не поможет! Статический анализ Golang проектов с помощью PVS-Studio

На нем написан Docker, Kubernetes, Gitea и многие другие проекты самых разных масштабов. Наверное, вы догадались, что речь идёт о Go. Мы никогда не писали об ошибках на Golang проектах, но настало время это исправить, ведь скоро выйдет анализатор PVS-Studio для Go!

Статические анализаторы являются довольно распространёнными инструментами в разработке. В Golang есть встроенный механизм статического анализа — go vet. Однако стандартные линтеры не всегда справляются. Для тех, кто с нами не знаком, мы — компания PVS-Studio, занимаемся разработкой одноименного статического анализатора для C, C++, C# и Java. В последнее время мы активно занимаемся разработкой анализатора для Go и уже скоро планируем выпустить открытую бета-версию.

В новом материале расскажем, какие нашли ошибки в популярных Golang проектах.

Теги:
Всего голосов 3: ↑3 и ↓0+4
Комментарии0

Открытый проект Go Katas поможет освоить язык программирования прямо Go. В репозитории решения есть сборник сотен ежедневных упражнений, чтобы довести навыки кодинга на Go до автоматизма, изучить конкурентность и Context, отработать Graceful Shutdown, а также защиту от утечек воркеров и правильный Fan-Out. Есть множество упражнений на Zero-Allocation парсинг, работу в sync.Pool и шардированные мапы.

Теги:
Рейтинг0
Комментарии0

Открытый мультиплатформенный проект Deletor умеет удалять ненужные и вредоносные файлы, кэш после рабочей сессии, улучшает производительность вашего SSD. Решение написано на Go.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Обновлён открытый ИБ-проект на Go под названием cariddi для поиска уязвимостей и проблемных мест на любых сайтах, включая спрятанные API‑ключи и токены, забытые админки, файлы, которые не должны были быть в открытом доступе.

Теги:
Всего голосов 5: ↑4 и ↓1+3
Комментарии0

Вышла новая версия fq 0.16.0

fq - это инструмент, язык и декодер для работы с двоичными данными. Конечная цель проекта — объединить в одном инструменте функции jq, hexdump, dd и gdb.

Поддерживаем массу форматов, полный список: https://github.com/wader/fq/blob/master/doc/formats.md

Написан на Golang.

Демонстрация работы
Демонстрация работы

GitHub: https://github.com/wader/fq

ChangeLog: https://github.com/wader/fq/releases/tag/v0.16.0

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Как написать свой линтер на Go?

Бэкенд-инженер AvitoTech Вячеслав Овчинников на стриме Go live-Coding разобрал механику линтеров и то, как работать с AST Go-проектов. Слава показал, что создание собственного правила — это не магия, а понятный и довольно увлекательный процесс. На стриме он:

  • написал простой, но полноценный линтер;

  • показал, как парсить AST и анализировать типы;

  • добавил своё правило и нашел проблемные конструкции в коде;

  • подключил линтер к golangci-lint.

Специально для вас мы сделали запись стрима, рекомендуем к просмотру всем, кому интересна тема линтеров на Go.

Запись стрима также есть на YouTube.

В ноябре Александр Кувакин, backend-инженер в команде Engineering Excellence AvitoTech, рассказывал в статье на Хабре о том, как backend-разработчикам выстраивать систему тестов на бэкенде. В тексте Саша разобрал основные проблемы и тесты, которые проверяют бизнес-логику. Почитать можно вот по этой ссылке.

А вот здесь вы найдете еще больше материалов по Go — статьи, видео, подкасты.

Теги:
Всего голосов 29: ↑29 и ↓0+31
Комментарии0

Представлен открытый проект Telegram Downloader, который умеет легально, быстро и легко скачивать любые файлы даже из защищённых каналов и чатов, где закрыта пересылка контента:

  • качает даже тяжёлые файлы за несколько секунд.

  • загрузки экспортируются в JSON-формат прямо на локальный диск.

  • работает локально — вся информация о загрузках будет только на локальном ПК.

  • не нарушает политику мессенджера.

Теги:
Всего голосов 7: ↑7 и ↓0+7
Комментарии0

Обновили 3 популярных курса Практикума PRO направления, которое объединяет программы для профи.

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

Курс «Визуализация данных и введение в BI-инструменты»

Что нового:

  • Расширили стек инструментов. К DataLens, Datawrapper и Tableau добавили Superset и Power BI — теперь вы освоите пять ключевых платформ вместо трёх.

  • Добавили SQL-шпаргалки для подготовки данных к работе в BI-системах.

  • Переработали материалы на основе фидбэка: обновили уроки, дополнили примеры, перезаписали скринкасты и скриншоты. А ещё добавили дополнительные практические задания.

Что это даст:

  • гибкость при выборе инструментов под конкретные задачи;

  • ускорение и упрощение рабочих процессов;

  • больше практики на реальных кейсах.

Курс «Инженер машинного обучения»

Что нового:

  • Дополнительно проверили и исправили блокирующие места во всех модулях.

  • Обновили модуль 5: «Создание uplift-модели».

  • В модулях 1-4 актуализировали все инструменты и технологии.

  • Обновили бесплатную вводную часть и добавили в неё мини-проект — если ещё не проходили, самое время потестировать!

Что это даст:

  • ещё более качественный студенческий опыт;

  • первый практический результат — даже до покупки курса;

  • востребованные навыки в скилсете.

Курс «Продвинутый Go-разработчик»

Что нового:

Запустили расширенный тариф «Продвинутый Go-разработчик + инфраструктура и продакшн». Внутри:

  • +3 дополнительных спринта.

  • Kubernetes & Docker: управление контейнерами, оркестрация, деплой.

  • Observability: мониторинг и трейсинг через OpenTelemetry, Grafana, Prometheus, Jaeger.

  • Брокеры сообщений: интеграция Apache Kafka и RabbitMQ.

  • Сквозной проект для отработки навыков: разработка и вывод в продакшн сервиса аватаров (GophProfile) с фокусом на инфраструктуру.

Что это даст:

  • закроет вопросы деплоя, мониторинга и интеграции брокеров сообщений;

  • фокус на практических навыках продакшн-разработки;

  • реальный опыт решения комплексной инфраструктурной задачи;

  • сокращение времени на выход в продакшн;

  • повышение надёжности систем: научитесь быстро выявлять и устранять проблемы;

  • все скилы для уверенной работы с микросервисами.

Теги:
Всего голосов 3: ↑2 и ↓1+1
Комментарии0

Узнавайте новое и бесплатно практикуйтесь в панели управления Selectel

Привет, Хабр! Обычно (хоть и не всегда) по пятницам я приношу подборки полезных материалов для начинающих специалистов. Но в этот раз у меня кое-что новое. Сегодня я расскажу не только о том, что почитать, но и как бесплатно отточить полученные знания, не тратя кровно заработанные на аренду IT-инфраструктуры.

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

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

  • Python — как настраивать инструменты, работать с базами данных, создавать программы с интерфейсом и использовать Python для парсинга. А еще интересные задачи для практики (вот тут-то точно пригодятся бонусы).

  • Расширения PostgreSQL — самые полезные с объяснением, как применять их без лишней теории.

  • Docker — что такое Docker, как запускать контейнеры, собирать образы и использовать Docker Compose. А еще — чем технология отличается от Kubernetes.

  • Сети — научитесь настраивать базовые сетевые схемы, поднимать выделенные и облачные серверы, разбираться в связанности, публичных IP и облачных маршрутизаторах.

Кстати, все статьи в подборках, как обычно, полностью бесплатны и доступны без регистрации и вот этого всего. Читайте, узнавайте новое и практикуйтесь бесплатно.

Теги:
Всего голосов 5: ↑4 и ↓1+6
Комментарии2

Save the date: встречаемся 27 ноября на Wildberries & Russ Golang Meetup!

27 ноября в 19:00 приглашаем на Golang Meetup, где поговорим о том, как строить надёжную бизнес-логику, управлять памятью без потерь производительности и проектировать масштабируемую событийную архитектуру.

В программе — три доклада от инженеров Wildberries & Russ, которые решают эти задачи в продакшене каждый день: про иерархические стейт-машины в Go, реальные кейсы оптимизации GC и указателей, а также опыт создания единой платформы событий Databus.

🎤 Доклады:

  • Иерархические стейт-машины: инструмент для организации бизнес-логики | Сергей Шлянин, Go-разработчик в WB Bank.

  • 1000 в 1: единая платформа для событий Databus | Виктор Такташов, Go-разработчик в платформе Trust & Safety.

  • Указатели в Go: от аллокации до GC — разбираем ошибки производительности на реальных примерах | Александр Бруяко, Unit Lead в сервисах Медиа.

После докладов — афтепати и нетворкинг с разработчиками Wildberries & Russ. 

Регистрируйтесь, количество мест в офлайн ограничено.

Теги:
Рейтинг0
Комментарии0

Задача с system design interview как тема для пет проекта

Здравствуйте, уважаемые читатели. Интересуюсь микро сервисной архитектурой. Хотел бы написать серию статей, в которых поделюсь своим опытом создания пет проекта на микросервисах. Общее название - "Задача с system design interview как тема для пет проекта". В качестве задачи будет система сокращения ссылок. Хочу показать весь путь от реализации первой крайне упрощенной версии до полноценной версии с кешированием, базой данных и размещением на сервере. Система будет реализована на Golang. На Хабре уже есть статья с такой темой. Как Вы думаете нужны ли еще статьи по данной тематике?

Теги:
Всего голосов 3: ↑2 и ↓1+2
Комментарии0

Вышла новая версия Vacuum 0.19.5.

Vacuum – сверхбыстрый и лёгкий инструмент линтера и проверки качества OpenAPI, написанный на Golang и вдохновлённый Spectral. Он также совместим с существующими наборами правил Spectral.

Ключевые изменения релиза - исправление ряда ошибок.

GitHub: https://github.com/daveshanley/vacuum

ChangeLog: https://github.com/daveshanley/vacuum/releases/tag/v0.19.5

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Вышел Goose 3.26.0.

Goose — это инструмент для миграции баз данных. Он представляет собой одновременно CLI и библиотеку. Управление схемой базы данных выполняется с помощью инкрементных миграций. Поддерживается SQL и Golang.

Поддержка БД: Postgres, MySQL, SQLite, YDB, ClickHouse, MSSQL и другие.

Ключевые изменения релиза:

  • Добавлена ​​поддержка slog.Logger в Goose-провайдере, работает через опцию WithSlog

  • Добавлена ​​более удобная опция WithTableName в Goose-провайдере

  • Добавлен универсальный интерфейс Locker для поддержки блокировки Postgres с табличной реализацией через lock.NewPostgresTableLocker

  • Исправлены незначительные ошибки и улучшены зависимости

GitHub: https://github.com/pressly/goose

ChangeLog: https://github.com/pressly/goose/releases/tag/v3.26.0

Теги:
Всего голосов 2: ↑2 и ↓0+3
Комментарии0

Вышел NATS.go 1.46 - Go-клиент для системы обмена сообщениями NATS.

Ключевые изменения:

  • Появились параметры конфигурации счетчиков стримов

  • Новые поля в ClusterInfo

  • Контекст и таймаут опции для Messages.Next() а также появился в Fetch поддержка контекста

  • Поддержка пользовательских префиксов имен для консумеров

  • Добавлена ​​поддержка метаданных для KeyValue бакета.

  • Ошибка добавления максимального лимита потребителей (код=10026).

  • Возвращает более конкретную информацию об ошибке при проблемах пересоздания потребителя

GitHub: https://github.com/nats-io/nats.go

ChangeLog: https://github.com/nats-io/nats.go/releases/tag/v1.46.0

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Хеш-таблица с транзакциями на Go

Привет, продолжим удивительное. Смех смехом, но на Go стали доступны:

  1. Хеш-таблица с транзакциями.

  2. Структуры данных второго порядка.

И в отличие от C++, они еще не создают проблемы для Garbage Collector. Вы угадайте почему, а я немного процитирую:

------------------8<------------------

Все выглядит примерно так:

func NewMemDb() MemDb { /* ... */ }

type MemDb interface {
    Close() error
    StartTrn() Transaction
}

type Transaction interface {
    Close() error

    Get(key Ptrsz) (Ptrsz, bool)
    All(getKeys bool, getVals bool) (keys []Ptrsz, vals []Ptrsz)

    Set(key Ptrsz, val Ptrsz)
    Del(key Ptrsz)

    DependVal(key Ptrsz, val Ptrsz)
    DependDel(key Ptrsz)

    Commit() error
    Rollback() error
}

А именно:

  • Объект MemDb создается с помощью функции NewMemDb().

  • У MemDb есть функция Close() -- мы ОБЯЗАНЫ ее вызвать!!!

  • Объект Transaction создается с помощью функции StartTrn().

  • У Transaction тоже есть функция Close(). Да, мы ОБЯЗАНЫ!

  • Transaction работает с данными через lib.Ptrsz. Точно также, как и mdb.BlobMap.

  • Чтение данных выполняется посредством функций Get() и All(). Возвращаемые ими Ptrsz указывают на внутренние структуры MemDb. Они остаются валидными пока не завершена транзакция и не было вызовов Set() и Del(), инвалидирующих указатели.

  • Изменение данных выполняется посредством функций Set() и Del()MemDb копирует себе байты, на которые указывают key и val.

  • Функции DependVal() и DependDel() устанавливают зависимости. Их проверяет Commit().

  • Функции Commit() и Rollback() завершают транзакцию. Завершают, но не закрывают! Мы ОБЯЗАНЫ вызвать Close()!!

  • Просто Close() означает Rollback().

------------------8<------------------

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

Теги:
Всего голосов 2: ↑1 и ↓10
Комментарии0

Вышла новая версия пакета easyjson - 0.9.1, содержит исправления выявленных ошибок.

Пакет easyjson предоставляет быстрый и простой способ маршалинга/демаршалинга структур Go в/из JSON без использования рефлексии. Фундамент - кодогенерация.

В тестах производительности easyjson превосходит стандартный пакет encoding/json в 4-5 раз, а другие пакеты работы с JSON — в 2-3 раза.

Easyjson стремится сделать сгенерированный код Go достаточно простым, чтобы его можно было легко оптимизировать или исправить. Вторая цель — предоставить пользователям возможность настраивать сгенерированный код, предоставляя функции, недоступные в стандартном пакете encoding/json, такие как генерация имён в формате «snake_case» или включение поведения omitempty по умолчанию.

GitHub: https://github.com/mailru/easyjson

Подробности исправления: https://github.com/mailru/easyjson/pull/423

Теги:
Рейтинг0
Комментарии0

Go + Windows = deadlock. Свет в конце тоннеля.

В прошлой статье я рассказывал о редком, но весьма опасном баге: поток под Windows зависал в вызове CancelIoEx, хотя документация Microsoft утверждает обратное. Суть проблемы — в пересечении синхронного и асинхронного ввода-вывода, где ядро Windows блокирует доставку APC, и поток остаётся навсегда «висящим».

История получила развитие не сама по себе: мы целенаправленно поднимали эту тему через support-кейс в Microsoft. В результате удалось подключить и Escalation Team, и разработчиков Go, ответственных за Windows-порт.

Финальный вывод: стандартная библиотека Go действительно использует неправильный API для отмены синхронных операций. Вместо CancelSynchronousIo, рекомендованного самой Microsoft, в коде до сих пор вызывается CancelIoEx.

👀 Сам проблемный вызов:
https://github.com/golang/go/blob/77f911e31c243a8302c086d64dbef340b0c999b8/src/internal/poll/fd_windows.go#L461

Хорошая новость: у команды уже есть рабочий proof-of-concept фикса:
https://go-review.googlesource.com/c/go/+/691395

Менее радостная часть: из-за сложности изменений и их влияния на рантайм правка запланирована только в Go 1.26 (февраль 2026). Бэкпорт в предыдущие версии практически исключён.

Что это значит для разработчиков

  • Если ваш сервис на Go под Windows внезапно «зависает» в CancelIoEx — это следствие бага в стандартной библиотеке, а не ваша ошибка.

  • До релиза Go 1.26 остаются обходные варианты:

    • не вызывать CancelIoEx для синхронных дескрипторов,

    • использовать CancelSynchronousIo, если есть возможность управлять потоками,

    • минимизировать использование пайпов в критичных местах.

Итог

Редкий flaky-тест Go (TestPipeIOCloseRace) оказался симптомом реальной и серьёзной проблемы. Благодаря эскалации через Microsoft Support и совместному разбору мы получили подтверждение, понятное объяснение и официальный фикс в планах.

⚡️ Если ваш Go-код на Windows зависает в CancelIoEx, теперь вы знаете: проблема признана и исправление уже в пути.

Теги:
Всего голосов 9: ↑9 и ↓0+11
Комментарии0

EasyP – тулбокс для работы с ProtoBuf⁠⁠

easyp – пакетный менеджер, билд-система и линтер для .proto файлов.
Хоть easyp и написан на #go 😱, одна из его фишек в том – что вы можете использовать любые плагины для генерации финального кода: он может быть хоть на #python, хоть на #rust.

Если много используете ProtoBuf – обязательно для ознакомления!

Пример конфигурации:

# Секция для правил линтера:
lint:
  use:
    - DEFAULT

# Секция с зависимостями:
deps:
  - github.com/googleapis/googleapis
  - github.com/grpc-ecosystem/grpc-gateway@v2.20.0

# Секция для правил сборки и генерации итоговых файлов:
generate:
  plugins:
    - name: go
      out: .
      opts:
        paths: source_relative
    - name: go-grpc
      out: .
      opts:
        paths: source_relative
        require_unimplemented_servers: false

Прощайте огромные Makefile с кучей скриптов для сборки.

Проект: https://github.com/easyp-tech/easyp

Документация: https://easyp.tech

Теги:
Всего голосов 4: ↑4 и ↓0+6
Комментарии6