В языке Go одним из важнейших преимуществ является мощная поддержка многопоточности и параллелизма за счёт горутин и каналов. В этой статье подробно разберём три продвинутых шаблона работы с горутинами:Fan-outFan-inPipelinesЭти паттерны позволяют писать эффективный, масштабируемый и читабельный многопоточный код.0. Как работают горутины под капотом в GO langВ примере Fan-out из статьи, распределение работы происходит следующим образом:Общий канал (jobs) используется как единая очередь задач, ку…
Хочу сразу пояснить, что я лично пишу на Go уже около 10 лет и уходить от него не планирую. Но тем не менее мне интересно мнение других разработчиков, которые работают или работали с Go на больших проектах. Во многом я согласен с недостатками Go, описанными ниже, так как сам сталкиваюсь с этими проблемами и на не самых больших проектах. Вот мой перевод статьи.1. Простота Go не справляется со сложностьюГлавное достоинство Go — его простота. Отсутствие сложных функций, сюрпризов и магии. Для небо…
Go предлагает уникальный и прямолинейный подход к обработке ошибок, отличающийся от try-catch в других языках. Он основан на явной проверке возвращаемых значений, что требует больших проверок, но ведет к более надежному коду. Рассмотрим основы, современные инструменты пакета errors и лучшие практики. Если вам интересен процесс и вы хотите следить за дальнейшими материалами, буду признателен за подписку на мой телеграм-канал. Там я публикую полезныe материалы по разработке, Go, советы как быть …
defer в Go — это мощный механизм для очистки ресурсов, закрытия файлов и разблокировки мьютексов. Вы наверняка слышали, что defer делает код чище и безопаснее.Когда вы открываете файл через os.Open() или os.Create(), Go выделяет ресурс операционной системы — дескриптор файла.И вот в чём важный момент:Этот дескриптор нужно обязательно закрыть через file.Close().Иначе файл останется "висеть" открытым — ресурсы будут утекать, программа начнёт захлёбываться или упадёт.Мьютекс (mutex = MUTua…
Go – язык простой, но из-за кажущейся простоты многие разработчики совершают одни и те же ошибки, которые приводят к серьёзным последствиям в production. Ниже собраны 15 самых распространённых ошибок при разработке на Golang и рекомендации по их исправлению.1. Игнорирование ошибокИгнорирование ошибок приводит к скрытым багам, которые сложно найти.Неправильно:_, err := ioutil.ReadFile("config.json")Правильно:data, err := ioutil.ReadFile("config.json") if err != nil { log.Fata…
Эпиграф в стиле А.П. Чехова по следам оригинального выступленияИван Семёныч Троицкий, программист сорока лет, застенчивый и робкий, от природы больше склонный к одиночеству, чем к публичным выступлениям, стоял в кулуарах конференции, смущённо улыбаясь и потирая ладонью вспотевший лоб. Доклад его — «Что не так с конкурентностью в Go и как с этим жить?» — принимали тепло, похлопывали по плечу и говорили:— Знатно выступил, Иван Семёныч, знатно!Однако он чувствовал, что наговорил массу пустяков. То…
Привет, Хабр! Сегодня разберёмся, зачем в Go существуют два способа создавать значения — make и new, чем они отличаются, как они работают и когда выбирать каждый из них Что мы вообще создаём в GoЧтобы понимать разницу между make и new, нужно начать с главного: в Go есть два больших семейства типов. Одни — это обычные значения (int, struct, массивы, float64, bool, и т. д.), другие — это ссылочные структуры, к которым относятся только три типа: slice, map и chan.Первое семейство — value types — м…
В предыдущей статье я попросил — «Расскажите, зачем вам DI‑контейнер в golang». Большое спасибо всем, кто оставил коммент и проголосовал. Общий вывод такой: используем контейнер, потому что с ним удобно писать тесты. Тесты — весомый аргумент, особенно в контексте того, что тест — это часть кода. Получается, мы все таки «тащим» Di‑контейнер в проект. Ну, хорошо....Вероятно, это будет uber‑fx, ведь у него хорошая документация, самое простое и понятное API по сравнению с другими..., или нет — не …
В мире распределенных систем и микросервисов сетевые сбои, временная недоступность сервисов или всплески нагрузки — не исключение, а скорее правило. Отказ одного компонента не должен каскадом обрушить всю систему. Здесь на помощь приходит механизм retry (повторные попытки).Грамотно реализованный retry позволяет системе самоисцеляться от временных проблем, делая ее более надежной и отказоустойчивой. Однако, неправильное использование ретраев может усугубить ситуацию, замаскировав серьезные пробл…