gram news
Библиотека Go (Golang) разработчика channel avatar

Библиотека Go (Golang) разработчика

@golang_lib

Полезные материалы по всему, что может быть полезно Golang разработчику. По всем вопросам @evgenycarter

ProjectsRUProgramming

2,690subscribers

Open the Channel

Latest posts

  • Библиотека Go (Golang) разработчика

    7 Sept, 05:29

    🗺️ sync.Map: Почему эта «серебряная пуля» иногда пробивает дно производительностиКак только новичок ловит свою первую панику fatal error: concurrent map writes, он тут же гуглит проблему, находит sync.Map и радостно заменяет все свои словари на него. Казалось бы, идеальное решение из коробки.Но если вы откроете исходники стандартной библиотеки Go, то увидите, что сами разработчики языка используют sync.Map крайне редко. В 95% случаев обычный map + sync.RWMutex порвет sync.Map по производительности.Давайте разберем, как эта штука устроена под капотом и почему она может тормозить ваш сервис.Архитектура двух корзин Внутри sync.Map лежат не одна, а две мапы:1. read: Доступна для чтения вообще без блокировок. 2. dirty: Защищена классическим мьютексом.Когда вы делаете Load(key), Go сначала бежит в read. Если ключ найден - супер, мы прочитали его lock-free. Но если ключа там нет,
  • Библиотека Go (Golang) разработчика

    2 Sept, 07:27

    ☢️ Пакет unsafe: Взламываем систему типов GoПакет unsafe - это легальный способ сказать компилятору: «Отключи ремни безопасности, я беру управление на себя». С его помощью можно обходить строгую типизацию и напрямую управлять памятью, но любая ошибка приведет к моментальному падению сервиса (Segmentation Fault).Проблема стандартной конвертации В Go строки (string) иммутабельны (неизменяемы), а срезы байт ([]byte) можно менять. Когда вы пишете s := string(bytes), Go вынужден копировать всю память. Это делается для того, чтобы вы не смогли изменить исходный массив и случайно поменять символы в строке. В высоконагруженных местах (парсинг JSON, HTTP-роутеры) эти копирования плодят мусор и съедают CPU.Zero-allocation конвертация (Go 1.20+) Долгое время разработчики занимались черной магией, жонглируя внутренними структурами StringHeader и SliceHeader через указатели. С версии Go 1.20 в
  • Библиотека Go (Golang) разработчика

    1 Sept, 08:16

    🔴 Тестовое собеседование с Go Senior с опытом работы в Яндексе, EPAM и Uzum в этот четверг3 сентября(в четверг!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Go-разработчика.Как это будет: 📂 Маруф Караев, Senior в европейской компании, ex-Uzum, ex-Яндекс, ex-EPAM будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Маруф будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос МаруфуЭто бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Go-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.Переходи в нашего бота, чтобы получить ссылку на
    Image from a post by Библиотека Go (Golang) разработчикаImage from a post by Библиотека Go (Golang) разработчика
  • Библиотека Go (Golang) разработчика

    1 Sept, 06:28

    Memory Alignment: Как сэкономить гигабайты RAM, просто поменяв строчки местамиВы написали структуру из трех полей: bool, int64 и еще один bool. Сколько байт она займет в оперативной памяти? Если вы ответили 10 (1 + 8 + 1) - вы мыслите логично. Но компилятор Go выделит под нее 24 байта. Вы только что отдали 14 байт под пустоту.В высоконагруженных системах с миллионами объектов в кэше этот нюанс превращается в гигабайты потерянной RAM. Это следствие механизма Memory Alignment (Выравнивания памяти).Почему 10 байт превращаются в 24?Процессор (на 64-битной архитектуре) читает память не по одному байту, а «машинными словами» - блоками по 8 байт. Чтобы процессор мог за один такт прочитать тяжелый тип данных вроде int64, этот тип обязан начинаться с адреса, кратного 8.Если перед ним лежит мелкий тип, компилятор принудительно забивает промежуток пустыми байтами (Padding).type BadUser
    43321Open in Telegram
  • Библиотека Go (Golang) разработчика

    26 Aug, 15:17

    🏃‍♂️ Escape Analysis: Почему указатели могут замедлить ваш кодВ языках вроде C/C++ вы сами решаете, где выделить память: на стеке (быстро, удалится само) или в куче (медленно, нужно чистить руками). В Java почти всё летит в кучу. А в Go вы пишете x := 10 и понятия не имеете, где эта переменная будет жить. За вас это решает компилятор с помощью механизма, который называется Escape Analysis (Анализ утечек).Сеньоры знают: чем больше объектов "убегает" со стека в кучу, тем больше работы у Garbage Collector'а, и тем медленнее работает сервис.Давайте посмотрим, как компилятор принимает это решение.Стек vs Куча (Кратко)• Стек (Stack): Память для локальных переменных функции. Выделяется мгновенно, очищается автоматически и бесплатно при выходе из функции (просто сдвигается указатель). Никакого GC! • Куча (Heap): Общая память. Выделение стоит процессорного времени (нужно найти
    502843Open in Telegram
  • Библиотека Go (Golang) разработчика

    24 Aug, 14:34

    🏗 go generate: Как писать код, который пишет код (и побеждает рефлексию)В прошлом посте мы выяснили, что пакет reflect - это медленно и опасно. Но как тогда писать универсальные инструменты? Валидаторы, парсеры, моки для тестов?В языках вроде Rust есть мощные макросы. В Java - аннотации и байт-код магия. В Go создатели пошли по пути брутальной простоты и дали нам Кодогенерацию.Идея звучит как лозунг киберпанка: "Пусть программа сама напишет для нас скучный код ДО того, как мы её скомпилируем".Как работает //go:generateВ Go встроен специальный механизм. Если вы напишете в любом файле магический комментарий (строго без пробела после //), тулчейн сможет его найти и выполнить.Возьмем классическую боль Go - "энумы" (перечисления). У нас есть статусы заказа, и мы хотим красиво выводить их в логи:package order//go:generate stringer -type=Statustype Status int
    46531Open in Telegram
  • Библиотека Go (Golang) разработчика

    23 Aug, 11:04

    🚀 Подборка полезных IT каналов в MaxСистемное администрирование, DevOps 📌https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса)Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак
    MAXСистемный Администратор | Sysadmin Windows & Linux Server. …Купить рекламу: https://telega.in/m/i_odmin Блог практикующего админа. Настройка Windows Server, Active Directory (AD), GPO и терминальных серверов (RDP). Раб…
    40631Open in Telegram
  • Библиотека Go (Golang) разработчика

    23 Aug, 08:00

    🪞 reflect: Черная магия Go, которую все боятся (но используют каждый день)Мы, гоферы, обожаем строгую типизацию. Нам нравится, когда компилятор бьет по рукам за попытку положить int в string. Но стоит нам написать json.Unmarshal(data, &user) или сходить в базу через GORM, как вся эта статическая безопасность летит в трубу.Под капотом этих удобств работает пакет reflect - мощный, опасный и медленный инструмент, который позволяет программе изучать и модифицировать саму себя во время выполнения.Почему его все так боятся? На это есть три причины.❌ 1. Паники на ровном местеКогда вы используете рефлексию, все ошибки компиляции превращаются в ошибки рантайма (паники). reflect не прощает ошибок с указателями.Попробуйте изменить значение переменной:x := 10 v := reflect.ValueOf(x) v.SetInt(20) // 💥 ПАНИКА: reflect: reflect.Value.SetInt using unaddressable valueПочему упало?
    431321Open in Telegram
  • Библиотека Go (Golang) разработчика

    19 Aug, 07:38

    🥊 Каналы vs Мьютексы: Главная ловушка философии GoВсе знают самую знаменитую пословицу Роба Пайка: "Не общайтесь, разделяя память; разделяйте память, общаясь".Джун читает это и делает вывод: «Мьютексы - это устаревшее зло из C++, каналы - это тру-Go-вей!». И после этого пишет 50 строк кода с горутиной-координатором, select и каналами просто для того, чтобы безопасно инкрементировать счетчик просмотров или обновить мапу.Сеньор смотрит на это и грустит, потому что знает секрет: под капотом любого канала (в структуре hchan) лежит... обычный мьютекс. Использовать канал просто для защиты переменной - это как купить таксопарк, чтобы один раз съездить за хлебом.Давайте раз и навсегда проведем границу.🛡 Когда берем Мьютексы (Состояние)Если ваша задача - защитить кусок данных (структуру, map, срез) от одновременного изменения, берите sync.Mutex или sync.RWMutex.- Это быстро:
    57253Open in Telegram
  • Библиотека Go (Golang) разработчика

    18 Aug, 11:25

    💣 defer: Три ловушки, в которые попадают даже сеньорыКоманда defer - это лучшее, что случалось с управлением ресурсами. Написал Lock(), тут же добавил defer Unlock(), и спишь спокойно. Больше никаких забытых закрытых файлов или коннектов к БД на ветках возврата с ошибкой.Но под этой элегантностью скрывается несколько неочевидных механизмов, которые регулярно взрывают продакшен.Давайте заглянем под капот и разберем классические ловушки.Миф: defer - это медленно Выходцы из старых версий Go (до 1.13) часто избегают defer в критичных к скорости участках кода, заявляя, что он тормозит (раньше каждый defer создавал структуру в куче). Забудьте об этом. Начиная с Go 1.14 компилятор делает Open-Coded Defers. Он статически встраивает вызов defer прямо перед каждым return на этапе компиляции. Сейчас накладные расходы на defer составляют ~1-2 наносекунды. Он практически бесплатный.Но есть
    549421Open in Telegram
  • Библиотека Go (Golang) разработчика

    10 Aug, 18:14

    ♻️ sync.Pool: Как перестать кормить Garbage Collector'аПредставьте, что вы работаете в кофейне. Приходит клиент, вы покупаете новую керамическую кружку, наливаете кофе, отдаете клиенту. Он выпивает кофе и... выбрасывает кружку в мусорку. А вы идете покупать новую.Звучит как бред? Но именно так ведет себя ваш код, когда вы создаете буферы make([]byte, 4096) внутри HTTP-хендлера, который обрабатывает 10 000 запросов в секунду. Вы непрерывно выделяете память, а Garbage Collector (тот самый уборщик из прошлых постов) сходит с ума, пытаясь всё это собрать. Сервис тормозит, CPU кипит.Решение проблемы sync.Pool. Это полка с чистыми кружками.Как это работает: Вместо того чтобы создавать объект с нуля, вы просите его у пула (Get). Попользовались - помыли - вернули в пул (Put).✅ Как это выглядит в коде:var bufPool = sync.Pool{ // Эта функция вызовется ТОЛЬКО если пул пуст // и нам
    66162Open in Telegram
  • Библиотека Go (Golang) разработчика

    8 Aug, 12:01

    🚀 Подборка полезных IT каналов в MaxСистемное администрирование, DevOps 📌https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса)Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак
    MAXСистемный Администратор | Sysadmin Windows & Linux Server. …Купить рекламу: https://telega.in/m/i_odmin Блог практикующего админа. Настройка Windows Server, Active Directory (AD), GPO и терминальных серверов (RDP). Раб…
  • Библиотека Go (Golang) разработчика

    4 Aug, 08:30

    🔴 Тестовое собеседование с Go Senior с опытом работы в Яндексе, EPAM и Uzum в этот четверг6 августа(в четверг!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Go-разработчика.Как это будет: 📂 Маруф Караев, Senior в европйской компании, ex-Uzum, ex-Яндекс, ex-EPAM будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Маруф будет комментировать каждый ответ респондента, чтобы дать понять, чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос МаруфуЭто бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Go-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_go_botРеклама. О рекламодателе.
    Image from a post by Библиотека Go (Golang) разработчикаImage from a post by Библиотека Go (Golang) разработчика
  • Библиотека Go (Golang) разработчика

    4 Aug, 07:41

    🌊 io.Reader и io.Writer: Лего для взрослых (и спасение от OOM)Знакомый сценарий: микросервис скачивает отчет из внешней системы. Когда вы его писали, отчет весил 5 МБ. Через полгода бизнес вырос, отчет весит 5 ГБ. Ваш под в Kubernetes ловит OOM (Out Of Memory) и бесславно умирает.Что делает в такой ситуации джуниор? Пытается увеличить лимиты памяти в Helm-чартах. Почему так вышло? Потому что код выглядит вот так:❌ Плохо (Смерть памяти):resp, _ := http.Get(url) // Вычитываем ВСЕ 5 Гигабайт в оперативную память data, _ := io.ReadAll(resp.Body) os.WriteFile("report.csv", data, 0644)В Go есть два интерфейса, на которых держится вообще вся стандартная библиотека. Это io.Reader и io.Writer. В них всего по одному методу (Read и Write), но они превращают ваш код в систему сообщающихся сосудов.Суть этих интерфейсов - стриминг (потоковая передача данных). Нам не нужно держать в
    64932Open in Telegram
  • Библиотека Go (Golang) разработчика

    30 Jul, 08:11

    Как спасти сборщик мусора от перегрева: используем sync.Pool 🛟В продолжение темы про аллокации в куче. Если ваш высоконагруженный бэкенд создает тысячи временных объектов в секунду (например, буферы для сборки ответов на HTTP-запросы или парсинга JSON), сборщик мусора (GC) начинает задыхаться, сжигая драгоценное процессорное время.Чтобы не выделять память каждый раз заново, в Go есть встроенный и мощный инструмент - sync.Pool.Что это такое? Это потокобезопасный механизм для хранения и переиспользования временных объектов.Как это работает:• Метод Get() достает объект из пула. Если пул пуст, автоматически вызывается функция New, которая создает новый экземпляр. • Метод Put() возвращает объект обратно в пул после того, как он стал не нужен.Где это реально полезно? Идеальный кандидат для пула - bytes.Buffer, массивы байт для чтения из сети или тяжелые структуры данных.
    75811Open in Telegram
  • Библиотека Go (Golang) разработчика

    22 Jul, 16:36

    Базовый стек межсервисного взаимодействия и наблюдаемости: HTTP(S), gRPC, Protobuf и OpenTelemetryСовременная микросервисная архитектура требует стандартизированных подходов к транспорту, сериализации данных и мониторингу. Понимание данного набора технологий необходимо для проектирования, эксплуатации и отладки распределенных систем.HTTP(S) Фундаментальный протокол взаимодействия. Базовые знания должны включать не только структуру запроса и ответа (заголовки, методы, коды состояния), но и механизмы работы на уровне сетевого стека:• Особенности установки защищенного соединения (TLS-хендшейк, управление сертификатами). • Управление постоянными соединениями (Keep-Alive) и пулинг соединений (Connection Pooling). • Архитектурные различия между версиями HTTP/1.1, HTTP/2 (мультиплексирование, бинарный фрейминг) и HTTP/3 (QUIC, устранение проблемы head-of-line blocking).gRPC Высокопроизв
    887111Open in Telegram
  • Библиотека Go (Golang) разработчика

    22 Jul, 09:05

    👣 Почему всё больше инфраструктурных проектов, облачных сервисов и высоконагруженных систем создают именно на Go? Если вы до сих пор воспринимаете этот язык как нишевый инструмент, возможно, пришло время взглянуть на него по-новому.🗓 28 июля в 20:00 МСК приглашаем вас на открытый урок в преддверии старта курса «Go-разработчик. Продвинутый уровень». Разберём, почему Go стал стандартом для создания современных сервисов и какие задачи он помогает решать быстрее и надёжнее.❗️Вы узнаете, где сегодня применяется Go: в микросервисах, облачной инфраструктуре, DevOps, высоконагруженных системах и информационной безопасности. Обсудим, какие преимущества язык даёт разработчикам, какие навыки востребованы работодателями и почему интерес к Go продолжает расти.➡️
    Image from a post by Библиотека Go (Golang) разработчикаImage from a post by Библиотека Go (Golang) разработчика
  • Библиотека Go (Golang) разработчика

    22 Jul, 06:27

    🚀 PGO: Как получить +10% к скорости, не написав ни строчки кодаВсе мы любим оптимизировать. Переписываем мапы, пулим объекты в sync.Pool, боремся с аллокациями. Но что, если я скажу, что в новых версиях Go (начиная с 1.21) можно ускорить приложение на 5-10%, просто подкинув компилятору один файлик?Profile-Guided Optimization (PGO).В чем проблема обычного компилятора? При стандартной сборке компилятор опирается на эвристики. Он смотрит на функцию и гадает: "Наверное, эту функцию вызывают часто, давай-ка я её заинлайню (inline), чтобы сэкономить на вызове". Но компилятор не знает, как ваш код ведет себя в реальном продакшене.Что меняет PGO? PGO ломает этот слепой подход. Вы берете профиль нагрузки (CPU profile) с реально работающего продакшена и отдаете его компилятору при сборке следующего релиза.Компилятор смотрит в профиль: "Ага, вот эта функция processOrder жрет 30% CPU,
    674211Open in Telegram
  • Библиотека Go (Golang) разработчика

    21 Jul, 19:57

    🚀 Базовые паттерны проектирования в Go: Пишем чистый кодGo не является классическим объектно-ориентированным языком. Здесь нет классов и наследования в привычном понимании, поэтому многие "книжные" паттерны (GoF) реализуются иначе. В Go делается упор на композицию, неявные интерфейсы и функции высшего порядка.Давайте разберем основные паттерны, которые чаще всего встречаются в продакшен-коде на Go.🛠 Порождающие паттерны (Creational)Эти паттерны решают задачи безопасного и удобного создания объектов.• Factory (Фабрика): В Go фабрики обычно представляют собой функции, начинающиеся с New... (например, NewService()). Чаще всего они возвращают интерфейс, а не конкретную структуру. Это скрывает внутреннюю реализацию и сильно упрощает написание моков для тестов. • Singleton (Одиночка): Гарантирует, что у объекта есть только один экземпляр. В Go он канонично и безопасно реализуется
    63021Open in Telegram
  • Библиотека Go (Golang) разработчика

    13 Jul, 08:04

    Разработчик приходит в Go из Java, Python или C# — и часто приносит с собой лишние слои, интерфейсы ради интерфейсов и сложную архитектуру там, где язык требует простоты.🗓 20 июля в 20:00 МСК приглашаем вас на открытый урок, где мы разберём, как перестроить мышление под философию Go и писать код, который проще читать, сопровождать и защищать на проверке.❗️На занятии поговорим об интерфейсах, ссылочных типах, строках, указателях, областях видимости, слайсах и мапах.🔴 Открытый урок проходит в преддверии старта курса «Go-разработчик. Продвинутый уровень».➡️ Зарегистрируйтесь, чтобы увидеть практический подход к Go без лишних абстракций: https://vk.cc/cZxhMhРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
    Image from a post by Библиотека Go (Golang) разработчикаImage from a post by Библиотека Go (Golang) разработчика