Category : golang

golang
Транзакционный Ratelimit

В статье расскажу про задачу и её решение, связанную с организацией лимитов для выполнения различных операций и http запросов. Изначально задача звучала как создание распределенного решения, библиотека или микросервис на основе хранилища в redis, который бы мог обеспечить достаточный уровень отказоустойчивости и наблюдаемости. Функциональные и не функциональные требования были обычными для подобной задачи и казалось, что можно обойтись стандартным готовым решением, но не тут то было.Основная …

  • воскресенье, 8 июня 2025 г. в 00:00:12
golang
Go-тесты: путь к надежному коду

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

  • воскресенье, 8 июня 2025 г. в 00:00:11
golang
Go synctest: Решение проблемы нестабильных тестов

Чтобы понять, что решает synctest, мы должны сначала рассмотреть основную проблему: недетерминизм в конкурентных тестах. func TestSharedValue(t *testing.T) { var shared atomic.Int64 go func() { shared.Store(1) time.Sleep(1 * time.Microsecond) shared.Store(2) }() // Проверяем общее значение через 5 микросекунд time.Sleep(5 * time.Microsecond) if shared.Load() != 2 { t.Errorf("shared = %d, want 2", shared.Load()) } } Этот тест …

  • воскресенье, 8 июня 2025 г. в 00:00:10
golang
Почему sync.Map — почти всегда плохая идея

Привет, Хабр!Сегодня разбираемся, почему sync.Map — выглядит аппетитно, но почти всегда оказывается не тем, чем вы ожидали. Откуда взялся sync.Map и зачем он был нуженК середине 2010-х стало очевидно: дефолтный подход map + sync.RWMutex не справляется с задачами, где тысячи горутин читают данные одновременно, а записи происходят редко. Особенно это чувствовалось в телеметрии, логировании, сборе метрик — в тех местах, где важно не терять данные, не аллоцировать лишнее и не мешать соседним потока…

  • суббота, 7 июня 2025 г. в 00:00:13
golang
Как устроены новые мапы в Go 1.24

Привет, Хабр! Меня зовут Владимир Марунин, я ведущий разработчик в команде Clatch. Сегодня расскажу о новых мапах в Go 1.24: разберем изменения, посмотрим, что было и что стало. О мапах часто спрашивают на собеседованиях, а еще без них нельзя просто так взять и написать программу на Go — так что, надеюсь, тема будет полезной и интересной.Этот текст — расширенная версия моего доклада с митапа МТС True Tech Go. Если больше нравится слушать, а не читать, можно сразу переходить по ссылке. Поехали! …

  • пятница, 6 июня 2025 г. в 00:00:09
golang
Балансировка gRPC в Kubernetes

Привет! Я Михаил Абраш — старший Go-разработчик, работаю в команде Evolution AI Factory в Cloud.ru. Недавно мы начали активно внедрять новые сервисы, переходя с Python на Go, и заметили, что нагрузка между репликами распределяется неравномерно. У нас в команде не было единого подхода к тому, как правильно делать балансировку, поэтому решили провести небольшое R&D-исследование. Что из этого вышло, к чему мы в итоге пришли и как работает балансировка gRPC в целом, рассказал в статье. Почему н…

  • четверг, 5 июня 2025 г. в 00:00:09
golang
Об (отсутствии) синтаксической поддержки обработки ошибок в Go

Программисты на Go уже давно и долго жалуются на слишком многословную обработку ошибок. Все мы близко (а иногда и болезненно) знакомы со следующим шаблоном кода:x, err := call() if err != nil { // обработка err }Проверка if err != nil встречается настолько часто, что может становиться объёмнее остального кода. Обычно это происходит в программах, выполняющих много вызовов API, в которых обработка ошибок рудиментарна и они просто возвращаются. Некоторые программы в итоге выглядят примерно…

  • четверг, 5 июня 2025 г. в 00:00:07
golang
Структурированные логи + локальный стек вызовов: эволюция обработки ошибок в Go

Каждый Go-разработчик знаком с этим паттерном — создание обёрток для ошибок с дублированием метаданных: func (*SomeObject).SomeMethod(val any) error { if err := otherMethod(val); err != nil { return fmt.Errorf("otherMethod %w with val %v", err, val) } return nil } Проблемы такого подхода: Дублирование названий методов в сообщениях об ошибках Ручное добавление метаданных (аргументы, переменные) в каждое место Сложность отслеживания места возникновения ошибки при нескольких то…

  • четверг, 5 июня 2025 г. в 00:00:06
golang
Десктопное кросс-платформенное приложение на Wails (Golang + Vue.js). Как мы делали Tuna Desktop

Что такое Wails?Wails - это легковесный фреймворк, предназначенный для создания кросс-платформенных GUI приложений рабочего стола на golang и стандартных веб технологиях (Svelte, React, Preact, Vue, Lit, Vanilla JS). Ближайшие аналоги это естественно Electron (JS), Tauri (Rust), хочется добавить Qt (С++), но это уже другой уровень. Сразу скажу, что Wails не идеален, имеет множество ограничений и в целом не подойдёт для чего-то крупного, Tauri к примеру более зрелый проект, больше функций, быстр…

  • четверг, 5 июня 2025 г. в 00:00:05