gram news
4gophers channel avatar

4gophers

@gophernews

Язык программирования Go. Больше новостей про разработку тут https://kodikapusta.ru/ Реклама https://kodikapusta.ru/ads

ProjectsRUProgramming

3,450subscribers

Open the Channel

Latest posts

  • 4gophers

    8 Sept, 08:29

    forwarded from @kodikapusta

    Прокси для базы данных#golangАвтор пишет простой такой прокси на Go в учебных целях вдохновившись статьей Figma о том, как их команда баз данных построила DBProxy для перехвата SQL-запросов и маршрутизации их по разным узлам Postgres.Он реализует проксирование TCP-соединений между клиентом и MySQL: перехватывает пакеты, находит команду COM_QUERY по структуре пакета MySQL и переписывает имя таблицы. В статье объясняется структура MySQL-пакета и демонстрируются базовые принципы, на которых строятся настоящие решения для шардинга, валидации запросов, безопасности и наблюдаемостиhttps://kodikapusta.ru/news/1208-proksi-dlia-bazy-dannykhПоддержать проект на boosty и читать в MAX
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    7 Sept, 09:15

    forwarded from @kodikapusta

    У нас отмена!#golangСтатья разбирает, как пакет singleflight в Go предотвращает лавину запросов к кэшу. Он прекрасно схлопывает одинаковые запросы в одну операцию, но есть нюансыАвтор на примере IsleDB показывает "ловушку контекста первого вызывающего": если фетч использует контекст лидера, тот может отменить операцию для всех, а если контекст отсоединен, то хрен сделаешь грейсфул шатдаун. В итоге автор строит собственный протокол конкурентности с тремя гарантиями - каждый вызывающий может независимо прекратить ожидание, общая операция отменяется при уходе последнего ждущего, а гатдаун отклоняет новые вызовы, отменяет активную работу и ждет остановки всех воркеровhttps://kodikapusta.ru/news/1197-u-nas-otmenaПоддержать проект на boosty и читать в MAX
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    3 Sept, 13:23

    forwarded from @kodikapusta

    Конкурентный сервер на Go#golang #learnЭто восьмая часть серии о конкурентных сетевых серверах, в этот раз посвященная Go. В прошлый раз было про RustАвтор показывает, как язык решает описанные ранее задачи. Статья начинается с последовательного сервера с state machine, затем показывает конкурентную версию с одной горутиной на клиента.Для ограничения параллелизма предлагаются счетный семафор на канале и паттерн воркер пул, когда нужно сохранять состояние между задачами.Логично, что в Go почти никогда не нужно прибегать к async/event-driven программированию, потому что конкурентность встроена в язык и рантайм. Но интересно смотреть в сравнении с другими языкамиhttps://kodikapusta.ru/news/1203-konkurentnyi-server-na-goПоддержать проект на boosty и читать в MAX
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    2 Sept, 10:11

    forwarded from @kodikapusta

    Интересные баги#golangКоманда sigma star(хз кто это) нашла и исправила давнюю ошибку в рантайме Go, проявлявшуюся только на 32-битных встраиваемых Linux-системах.Приложение периодически падало с ошибкой "runtime: netpoll: eventfd ready for something unexpected". Корень проблемы оказался в том, что Go хранит в 8-байтовом поле ev.Data два типа указателей - сырой указатель на event fd и тегированный указатель на pollDesc, а сравнение на 32-битных little-endian системах считывает лишь младшие 4 байта, из-за чего адрес event fd алиасился с fdseq. Как только долгоживущая программа накапливала миллионы пересозданных pollDesc, netpoll путал сокет с event fd и падалРебята прям недра залезли. Представляю как они все это дебажилиhttps://kodikapusta.ru/news/1198-interesnye-bagiПоддержать проект на boosty и читать в MAX
    Image from a post by 4gophersImage from a post by 4gophers
    89652Open in Telegram
  • 4gophers

    1 Sept, 08:26

    forwarded from @kodikapusta

    GopherCon UK 2026#golang #videoВидосы с GopherCon UK 2026 подоспели. Много всего интересного. Девид Чейни, Билл Кеннеди и другие широко известные в узких кругах докладчики.И даже про AI есть вполне адекватные докладыhttps://kodikapusta.ru/news/1196-gophercon-uk-2026Поддержать проект на boosty и читать в MAX
    Image from a post by 4gophersImage from a post by 4gophers
    77511Open in Telegram
  • 4gophers

    31 Aug, 10:28

    forwarded from @kodikapusta

    Используем Datastar#golangВ статье интеренсно про использование Datastar. Я вот первый раз про него услашалАвтор рассказывает, как построить веб-версию утилиты htop используя Go-бэкенд и, собственно, гипермедиа-фреймворк Datastar. Вместо фронтенд-фреймворка вроде React здесь HTML-патчи отправляются напрямую с сервера через Server-Sent Events. Вся интерактивность задается декларативными data- атрибутами, поэтому клиентский код остается минимальным.Системные метрики собираются библиотекой gopsutil, HTML шаблон вшивается в бинарник через go:embed, поэтому все приложение - это один бинарьКончено, Datastar не заменит React или Vue, но отлично подойдет для случаев, когда состояние живет преимущественно на бэкенде. В целом, это довольно интересный подходhttps://kodikapusta.ru/news/1195-ispol-zuem-datastarПоддержать проект на boosty и читать в MAX
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    27 Aug, 09:14

    forwarded from @kodikapusta

    На Rust после Go#rust #golangАвтор, пять лет писавший на Go, сначала скептически отнесся к появлению Rust в его команде.Но появился проект, в котором нужны были низкое потребление памяти и mpmc-обмен сообщениями. Пожтому несколько CLI и сервисов решили переписать на Rust и это заставил его освоить язык всерьез.Переход оказался непростым. Больше всего дались строгость компилятора, макросы и, главное, borrow checker(ну конечно) и async с лайфтаймами, которые он советует изучить в первую очередь. Теперь он ценит именно эту строгость.В итоге автор рекомендует если Go справляется, то использовать Go. А Rust брать при реальных ограничениях по памяти, стабильности и близости к железу. Ну или если вы ебнулись и решили все переписать на Rust с помощью AIhttps://kodikapusta.ru/news/1189-na-rust-posle-goПоддержать проект на boosty и читать в MAX
    Image from a post by 4gophersImage from a post by 4gophers
    1,080122Open in Telegram
  • 4gophers

    26 Aug, 15:32

    forwarded from @kodikapusta

    tnk9x#golang #gamedev #toolsСовременный ремейк классической аркадной игры Battle City, написанный на Go с использованием движка Ebiten и запускаемый как нативно, так и в браузере через WebAssembly. Проект сочетает любовь к оригиналу с изучением Go и разработки игр.Реализованы полный игровой цикл с защитой штаба, управление для двух игроков, разрушаемая местность, все пять типов поверхностей, четыре типа врагов и все шесть бонусов. Враги, кстати, на на Lua-скриптах реализованыhttps://kodikapusta.ru/tools/43-tnk9xПоддержать проект на boosty и читать в MAX
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    24 Aug, 09:15

    forwarded from @kodikapusta

    Поговорим про PGO#golangProfile-guided optimization (PGO) заменяет эвристические догадки компилятора реальными замерами.Вы запускаете программу, записываете CPU-профиль и передаете его компилятору для повторной сборки, который использует эти данные в основном для инлайнинга горячих вызовов и девиртуализации интерфейсных вызововАвтор протестировал PGO в Go на трех JSON-документах, парся их стандартным encoding/json: прирост оказался скромным - лучший результат +4,7%, а большинство случаев в диапазоне 2–3%https://kodikapusta.ru/news/1173-pogovorim-pro-pgoПоддержать проект на boosty и читать в MAX
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    20 Aug, 10:53

    forwarded from @kodikapusta

    KV на S3#golangСтатья разбирает, как построить key-value базу данных, у которой основным слоем хранения является объектное хранилище вроде S3, на примере движка IsleDB на Go, и почему наивная замена "файлов на диске" на "объекты в бакете" не работает. СУБД неявно полагается на атомарное переименование, дешевые случайные чтения и понятный ответ на вопрос "записалось ли?".Ключевая идея в том, что LSM-дерево уже идеально ложится на объектную модель, а видимость состояния задается не перечислением бакета, а маленьким мутабельным объектом заголовком, который обновляется условной записью (используется CAS), дополняется токеном для защиты от "оживших" старых писателей и ограниченным маркером коммита для разрешения ситуации "запись прошла, но ответ потерялся".Объектное хранилище вот совсем не убирает сложные проблемы СУБД. Наборот, концентрирует их в небольшом наборе протоколов
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    17 Aug, 08:39

    forwarded from @kodikapusta

    Go идеален для AI#golang #aiВ эпоху ИИ-помощников узкое место разработки сместилось с написания кода на его проверку, ревью и сопровождениеА какой язык просто читать? Конечно Go!Go - это целая платформа со встроенным форматтером, тестами, управлением зависимостями и инструментами безопасности, которые ИИ-агенты могут использовать для самокоррекции и генерации более надежного кода.Ставка на читаемость и строгую стандартизацию делает сгенерированный код предсказуемым и легким для проверки человеком, а статическая типизация и быстрая компиляция позволяют отлавливать галлюцинации моделей еще до запуска в проде. Наконец, гарантия обратной совместимости, единый статический бинарник и встроенные инструменты модернизации обеспечивают долгосрочную поддерживаемость кода, который пишут люди и ИИ совместноhttps://kodikapusta.ru/news/1172-go-idealen-dlia-aiПоддержать проект на boosty и
    Image from a post by 4gophersImage from a post by 4gophers
    1,21042Open in Telegram
  • 4gophers

    14 Aug, 14:51

    forwarded from @kodikapusta

    paneru#rust #toolsОконный менеджер для macOS, который размещает окна на бесконечной полосе, расширяющейся вправо. При открытии нового окна размер существующих окон не меняется, новые окна не накладываются друг на друга - все окна просто красиво выровнены в один ряд с возможностью прокрутки.Интересный опытhttps://kodikapusta.ru/tools/41-paneruПоддержать проект на boosty и читать в MAX
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    12 Aug, 08:20

    forwarded from @kodikapusta

    Typescript Defer#golangАвтор экспериментировал с добавлением оператора defer из Go в компилятор TypeScript, реализовав парсинг, проверки и AST-трансформацию, которая оборачивает тело функции в try/finally и выполняет отложенные вызовы в обратном порядке (LIFO) с захватом значений на момент регистрации.В процессе он столкнулся с принципиальными сложностями: ошибки в JavaScript - это поток управления, а не значения, как в Go, поэтому пришлось вводить политики агрегации исключений через AggregateError, последовательный await для асинхронной очистки и явный запрет defer await.В итоге автор пришел к выводу, что defer плохо ложится на модель ошибок TypeScript/JavaScript, и рекомендует использовать нативный using из пропозала Explicit Resource Management как более идиоматичную альтернативу, что логичноhttps://kodikapusta.ru/news/1164-typescript-deferПоддержать проект на boosty и
    Image from a post by 4gophersImage from a post by 4gophers
    1,340211Open in Telegram
  • 4gophers

    10 Aug, 09:37

    forwarded from @kodikapusta

    Go 1.27#golangАнтон Жиянов делал интерактивные туры по Go с версии 1.22 по 1.26, но решил остановиться. Хесус Эспино подхватил эстафету и разбирает здесь огромный массив нововведений Go 1.27 - от обобщенных методов и профиля goroutineleak до нового пакета uuid и экспериментальной переносимой SIMDhttps://kodikapusta.ru/news/1161-go-1-27Поддержать проект на boosty и читать в MAX
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    7 Aug, 08:51

    forwarded from @kodikapusta

    SIMD в go#golangБудущее пришло быстрее, чем ожидалось: в go1.27rc2 пакет simd стал портируемым, и один Go-код разворачивается в Neon на Apple Silicon и в AVX2 на Intel. Это наборы векторных инструкций двух процессорных миров, ликбез по ним как раз в этой статье.Автор проверит обещания портируемости на живом железе: один исходник, два дизассемблера, две пачки замеров. Ассемблер писать не будем, весь код запускается копипастойГодная статья на Хабре. Аж не веритсяhttps://kodikapusta.ru/news/1160-simd-v-goПоддержать проект на boosty: https://boosty.to/kodikapusta
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    5 Aug, 16:20

    forwarded from @kodikapusta

    Swiss Tables#golangСтатья подробно разбирает переход Go 1.24 от классической bucket-архитектуры мап к Swiss Tables - дизайну, позаимствованному из Abseil, который заменяет цепочки оверфлоу-указателей на плоское открытое адресование с компактными контрольными байтами и групповым probing'ом по 8 слотов.Swiss Tables позволяют совершать меньше промахов кеша за счет отказа от «погони за указателями», увеличивается допустимая плотность заполнения, и фильтрация кандидатов становится более быстрой по h2-отпечатку до полноценного сравнения ключей.На микробенчмарках доступ к большим мапам ускорился на 30–35%, итерация - до 60% на разреженных картах, однако на уровне приложений выигрыш скромнее, около 1.5% в среднем, а в сценариях с холодным кешем и очень большими разреженными мапами возможны регрессы.Да-да, уже 100% раз читали про швейцарские таблицы. Но статью в закладки лучше добавить
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    3 Aug, 15:51

    forwarded from @kodikapusta

    metago#golang #toolsИнструмент метапрограммирования для Go на основе шаблонов: вы определяете переиспользуемый Go-шаблон в файле .metago (синтаксис Go-темплейтов), а в исходном коде вешаете директиву //mgo:gen stringer на тип или объявление, и metago рекурсивно сканирует проект, находит все шаблоны и генерирует код в сайдкар-файлы meta.go рядом с исходниками.Поддерживает встроенную генерацию через //mgo:inline ... //mgo:end, кастомные параметры, аргументы с дефолтами через metago.toml и встроенные стандартные шаблоны: std.stringer, std.enum, std.mock, std.serde. И один шаблон может собирать данные из всех директив пакетаВот с этими //mgo:gen ... прям приятно работатьhttps://kodikapusta.ru/tools/29-metagoПоддержать проект на boosty: https://boosty.to/kodikapusta
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    3 Aug, 08:40

    forwarded from @kodikapusta

    Визуализируем GC#golangСтатья наглядно исследует новый сборщик мусора Green Tea в Go 1.25/1.26.Автор пишет визуализатор кучи, показывающий, как Go размещает объекты одного размерного класса рядом друг с другом и сравнивает его с C#. Он отмечает, что в отличие от C#, Go никогда не перемещает их при сборке.Ключевое улучшение Green Tea в том, что вместо обхода указателей по мере их обнаружения со случайным доступом к памяти, GC теперь сканирует span целиком и сохраняет знания о найденных указателях в очередь на будущее и это подтверждается через perf.В конуе автор демонстрирует главную слабость неперемещающего GC. После освобождения 90% объектов разряженные страницы не возвращаются системе, потому что выжившие объекты "закрепляют" span'ы. Для сравнения, компактирующий GC в C# справляется с этим автоматически, а в Go приходится вручную копировать выжившие объекты в новые слайсыht
    Image from a post by 4gophersImage from a post by 4gophers
  • 4gophers

    28 Jul, 08:27

    forwarded from @kodikapusta

    Арены жалко#golangGo отказался от экспериментальных Memory Arenas - механизма, позволявшего выделять память крупными пулами в обход GC для снижения накладных расходов в высоконагруженных сценариях.Автор считает это стратегической ошибкой. Формальной причиной стали проблемы безопасности, когда можно попытаться использовать память после ее освобождения. И еще никому не понравилась несовместимость с интерфейсами - пришлось бы добавлять аргумент Arena в сигнатуры функций, и это раскололо бы экосистему на стандартный и arena-миры, подобно тому как context.Context когда-то "инфицировал" весь Go.Но, по мнению автора, реальная опасность в том, что Go добровольно ограничил свой потолок производительности в момент, когда быстрые интерпретируемые языки догоняют его сверху, а системные языки вроде Rust и Zig становятся проще снизу. Go рискует остаться застывшим в "среднем" сегменте, став
    Image from a post by 4gophersImage from a post by 4gophers
    1,3907321Open in Telegram
  • 4gophers

    27 Jul, 09:03

    forwarded from @kodikapusta

    687 ГБ аллокаций#golangАвтор профилировал свою многопоточную реализацию Redis на Go и обнаружил, что одна строка кода s.kvList[k] = append(v[popped:], s.kvList[k]...) за время бенчмарка суммарно аллоцировала 687 ГБ памяти. Реально приложение держало в памяти лишь около 4,58 МБ. В чем прикол?Проблема была в том, что LPUSH каждый раз создавал новый массив и копировал весь существующий список, давая O(n²) по аллокациям, тогда как RPUSH использовал штатную стратегию роста слайсов с амортизированным O(1).Замена на deque с двумя индексами, растущий от середины в обе стороны, ускорила LPUSH в 33 раза, а аллокации упали с 715 ГБ до 27 ГБНужно быть внимательнымhttps://kodikapusta.ru/news/1136-687-gb-allokatsiiПоддержать проект на boosty и читать в MAX
    Image from a post by 4gophersImage from a post by 4gophers