Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Отличная статья: «Я создал безголовый браузер на Go. Вот что я узнал»
Автор статьи рассказывает, как он создал безголовый браузер на Go (Gost-DOM) для тестирования HTMX-приложений.
Он столкнулся с задачами парсинга HTML и выполнения JavaScript, использовал x/net/html и встроил движок V8. В итоге получил легковесный инструмент, подходящий для TDD в Go.
👉 Подробности можно найти здесь
👉 @juniorGolang | #cтатья
Автор статьи рассказывает, как он создал безголовый браузер на Go (Gost-DOM) для тестирования HTMX-приложений.
Он столкнулся с задачами парсинга HTML и выполнения JavaScript, использовал x/net/html и встроил движок V8. В итоге получил легковесный инструмент, подходящий для TDD в Go.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1
Осваиваем HTTP/2 Server Push на Go: повышаем производительность веб-приложений
Автор подробно описывает, как сервер может заранее отправлять клиенту важные ресурсы (например, CSS, JavaScript, изображения) до их явного запроса, приводя примеры кода для реализации этой техники.
Помимо базовой реализации, обсуждаются такие аспекты, как учёт состояния кэша клиента, управление приоритетами пуша, ограничение количества отправляемых ресурсов (push budget), интеграция с CDN и использование клиентских подсказок для более точной оптимизации.
👉 Подробности можно найти здесь
👉 @juniorGolang | #cтатья
Автор подробно описывает, как сервер может заранее отправлять клиенту важные ресурсы (например, CSS, JavaScript, изображения) до их явного запроса, приводя примеры кода для реализации этой техники.
Помимо базовой реализации, обсуждаются такие аспекты, как учёт состояния кэша клиента, управление приоритетами пуша, ограничение количества отправляемых ресурсов (push budget), интеграция с CDN и использование клиентских подсказок для более точной оптимизации.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - emiago/sipgo: SIP library for writing fast SIP services in GO
SIP library for writing fast SIP services in GO. Contribute to emiago/sipgo development by creating an account on GitHub.
👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Операции со слайсами в Go
Здесь наглядно показывается, как работают слайсы, какие они имеют методы и как взаимодействуют с разными функциями
⛓ Ссылка: тык
👉 @juniorGolang | #ресурсы
Здесь наглядно показывается, как работают слайсы, какие они имеют методы и как взаимодействуют с разными функциями
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17
https://github.com/xataio/pgroll
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Оптимизация запросов в Go с real-time batching
Real-time batching — это стратегия обработки входящих данных, при которой вместо выполнения каждой операции по одной они накапливаются в батч и обрабатываются вместе через небольшие интервалы времени.
— Как это работает пошагово
1. Сбор событий в буфер — вместо того чтобы сразу обрабатывать каждое событие, мы добавляем его в очередь или в канал.
2. Таймер или лимит батча — если прошло, например, 50 мс, или набралось 100 событий, запускается обработка.
3. Групповая обработка — все собранные события обрабатываются одним запросом к базе данных, API или другому ресурсу.
— Где применяется
• Базы данных – массовые INSERT и UPDATE, минимизирующие нагрузку
• Очереди сообщений – накопление сообщений перед отправкой
• Логирование – запись логов блоками вместо построчной записи
• Аналитика – сбор событий перед отправкой в мониторинговую систему
👉 Подробности с примерами кода в статье
👉 @juniorGolang | #cтатья
Real-time batching — это стратегия обработки входящих данных, при которой вместо выполнения каждой операции по одной они накапливаются в батч и обрабатываются вместе через небольшие интервалы времени.
— Как это работает пошагово
1. Сбор событий в буфер — вместо того чтобы сразу обрабатывать каждое событие, мы добавляем его в очередь или в канал.
2. Таймер или лимит батча — если прошло, например, 50 мс, или набралось 100 событий, запускается обработка.
3. Групповая обработка — все собранные события обрабатываются одним запросом к базе данных, API или другому ресурсу.
— Где применяется
• Базы данных – массовые INSERT и UPDATE, минимизирующие нагрузку
• Очереди сообщений – накопление сообщений перед отправкой
• Логирование – запись логов блоками вместо построчной записи
• Аналитика – сбор событий перед отправкой в мониторинговую систему
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤3
Приятное улучшение качества жизни в Go 1.24:
Команда
Если есть несохранённые изменения, добавляется суффикс
👉 @juniorGolang
Команда
go build теперь устанавливает версию главного модуля (BuildInfo.Main.Version) в скомпилированном бинарнике на основе тега или коммита из системы контроля версий.Если есть несохранённые изменения, добавляется суффикс
+dirtyPlease open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥6
Концепции, которые должен знать каждый разработчик: параллелизм — это НЕ конкурентность
Параллелизм и конкурентность — два термина, которые часто вызывают путаницу.
Как метко заметил Роб Пайк (один из создателей GoLang): «Конкурентность — это про управление множеством задач одновременно. Параллелизм — это про выполнение множества задач одновременно.»
Один термин связан с управлением несколькими задачами одновременно, чередуя их для оптимизации использования ресурсов.
Другой — с одновременным выполнением нескольких задач, обычно на нескольких процессорах или ядрах.
— Что такое конкурентность?
Управление несколькими задачами на одном процессоре, чередуя их таким образом, чтобы создавалось впечатление одновременного выполнения, называется конкурентностью.
Это относится к способности системы переключаться между несколькими задачами, а не выполнять их одновременно, создавая иллюзию параллельного выполнения.
Конкурентность эффективно использует процессорное время, особенно когда задачи вынуждены ждать завершения других.
— Что такое параллелизм?
Параллелизм подразумевает выполнение нескольких задач одновременно.
Это достигается за счет эффективного использования нескольких процессоров или ядер в вычислительной системе.
Различие между конкурентностью и параллелизмом напрямую влияет на производительность и эффективность приложений.
Поскольку параллелизм поддерживает одновременное выполнение задач, он особенно полезен для вычислительно-интенсивных приложений, которые распределяют задачи по нескольким процессорам.
— Асинхронное программирование
Асинхронное программирование используется для достижения конкурентности в однопоточных средах.
Этот подход позволяет программе запускать задачи без ожидания завершения предыдущих, управляя несколькими задачами в неблокирующем режиме.
Отличный пример — Node.js, который обрабатывает конкурентность в однопоточной модели с помощью обратных вызовов и циклов событий.
Между тем, многопоточные среды поддерживают как конкурентность, так и параллелизм.
Они позволяют выполнять задачи конкурентно на одном процессоре, а также обеспечивают истинный параллелизм на нескольких процессорах или ядрах одновременно.
Многопоточные языки программирования, такие как C#, предоставляют разработчикам возможность использовать эти функции.
Понимание различий между конкурентностью и параллелизмом — это важный аспект при создании высокопроизводительных и эффективных программных решений.
👉 @juniorGolang
Параллелизм и конкурентность — два термина, которые часто вызывают путаницу.
Как метко заметил Роб Пайк (один из создателей GoLang): «Конкурентность — это про управление множеством задач одновременно. Параллелизм — это про выполнение множества задач одновременно.»
Один термин связан с управлением несколькими задачами одновременно, чередуя их для оптимизации использования ресурсов.
Другой — с одновременным выполнением нескольких задач, обычно на нескольких процессорах или ядрах.
— Что такое конкурентность?
Управление несколькими задачами на одном процессоре, чередуя их таким образом, чтобы создавалось впечатление одновременного выполнения, называется конкурентностью.
Это относится к способности системы переключаться между несколькими задачами, а не выполнять их одновременно, создавая иллюзию параллельного выполнения.
Конкурентность эффективно использует процессорное время, особенно когда задачи вынуждены ждать завершения других.
— Что такое параллелизм?
Параллелизм подразумевает выполнение нескольких задач одновременно.
Это достигается за счет эффективного использования нескольких процессоров или ядер в вычислительной системе.
Различие между конкурентностью и параллелизмом напрямую влияет на производительность и эффективность приложений.
Поскольку параллелизм поддерживает одновременное выполнение задач, он особенно полезен для вычислительно-интенсивных приложений, которые распределяют задачи по нескольким процессорам.
— Асинхронное программирование
Асинхронное программирование используется для достижения конкурентности в однопоточных средах.
Этот подход позволяет программе запускать задачи без ожидания завершения предыдущих, управляя несколькими задачами в неблокирующем режиме.
Отличный пример — Node.js, который обрабатывает конкурентность в однопоточной модели с помощью обратных вызовов и циклов событий.
Между тем, многопоточные среды поддерживают как конкурентность, так и параллелизм.
Они позволяют выполнять задачи конкурентно на одном процессоре, а также обеспечивают истинный параллелизм на нескольких процессорах или ядрах одновременно.
Многопоточные языки программирования, такие как C#, предоставляют разработчикам возможность использовать эти функции.
Понимание различий между конкурентностью и параллелизмом — это важный аспект при создании высокопроизводительных и эффективных программных решений.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤4🔥3🤯1
Простое веб-приложение, которое демонстрирует случайные репозитории на GitHub, написанные на Go
👉 github.com/Glup3/gorepos
👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤2
Параллельный шаблон потоковой обработки в Go: как значительно быстрее сканировать большие хранилища S3 или GCS
Статья объясняет, как ускорить перечисление файлов в S3 и GCS, используя параллельную обработку в Go.
Стандартные методы обходят файлы последовательно, что замедляет процесс при работе с миллионами объектов. Автор предлагает разбивать пространство имен бакета на диапазоны и обрабатывать их горутинами, сокращая время сканирования.
В статье приводится пример реализации с библиотекой Rill, а также советы по настройке количества потоков для максимальной производительности.
👉 Подробности можно найти здесь
👉 @juniorGolang | #cтатья
Статья объясняет, как ускорить перечисление файлов в S3 и GCS, используя параллельную обработку в Go.
Стандартные методы обходят файлы последовательно, что замедляет процесс при работе с миллионами объектов. Автор предлагает разбивать пространство имен бакета на диапазоны и обрабатывать их горутинами, сокращая время сканирования.
В статье приводится пример реализации с библиотекой Rill, а также советы по настройке количества потоков для максимальной производительности.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
https://github.com/GianlucaP106/minecraft
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥11
Как я отправил 500 миллионов HTTP-запросов на 2,5 миллиона хостов
Dawid Moczadło рассказывает, как он отправил 500 миллионов HTTP-запросов на 2,5 миллиона хостов за 24 часа, используя Go.
Основные моменты:
🔹 Использование простоты и конкурентности Go
🔹 Модифицированная HTTP-библиотека Go для повышения эффективности
🔹 Развернул 60 подов, каждый из которых выполнял 100–400 запросов в секунду
👉 Подробности можно найти здесь
👉 @juniorGolang | #cтатья
Dawid Moczadło рассказывает, как он отправил 500 миллионов HTTP-запросов на 2,5 миллиона хостов за 24 часа, используя Go.
Основные моменты:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤4🤯3
Знали ли вы, что можно проанализировать любой Go-бинарник и узнать, с какой версией Go он был собран?
Команда
Очень пригодится при отладке бинарников, отправленных в продакшен👍
👉 @juniorGolang
Команда
go version -m <file> делает именно это, а также показывает другую полезную информацию о сборке. Очень пригодится при отладке бинарников, отправленных в продакшен
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤1
Конструктор схем для Go для разбора и валидации значений во время выполнения. Определяйте схемы, преобразовывайте значения, проверяйте соответствие структурам или выполняйте и то, и другое.
Схемы Zog выразительны, что позволяет выполнять сложную валидацию или трансформации.
👉 GitHub: https://github.com/Oudwins/zog
👉 @juniorGolang | #ресурсы
Схемы Zog выразительны, что позволяет выполнять сложную валидацию или трансформации.
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - Oudwins/zog: Go with Zod inspired simple schema validation
Go with Zod inspired simple schema validation. Contribute to Oudwins/zog development by creating an account on GitHub.
👍3
Как реализовать аутентификацию JWT в вашем Golang API
Статья описывает внедрение JWT-аутентификации в API на Go с использованием https://github.com/golang-jwt/jwt
Рассматриваются преимущества JWT, разделение на Access и Refresh токены для управления сессиями, а также приводится практическая реализация.
👉 Подробности можно найти здесь
👉 @juniorGolang | #cтатья
Статья описывает внедрение JWT-аутентификации в API на Go с использованием https://github.com/golang-jwt/jwt
Рассматриваются преимущества JWT, разделение на Access и Refresh токены для управления сессиями, а также приводится практическая реализация.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
Создание контейнерного образа golang для продакшена
Одна из причин, по которой я люблю Go, — это простота сборки и контейнеризации. Однако важно, чтобы продакшен-приложение имело минимальную поверхность атаки, было портативным и занимало мало места.
Давайте разберёмся, как этого добиться.
1. Используем многоступенчатую сборку
Берём официальный образ Go 1.24.0 и называем этот этап
🔹 Подробнее: Docker multi-stage build
2. Копируем код проекта
Это перемещает файлы проекта в контейнер и устанавливает рабочую директорию
3. Улучшаем безопасность компиляции
Опции компилятора C для защиты стека и предотвращения атак.
🔹 Подробнее: Stack protection in GCC & Clang
Команда для сборки Position Independent Executable (PIE) — это добавляет дополнительный уровень безопасности
4. Используем distroless-образ для финального контейнера
На этом этапе мы используем Distroless вместо обычного Linux-образа.
🔹 Почему это важно? Distroless-образы меньше, безопаснее и не содержат ненужных пакетов. Подробнее: GoogleContainerTools/distroless
5. Копируем собранный бинарник
Переносим скомпилированный Go-файл в финальный образ. Замените
6. Запускаем контейнер с минимальными привилегиями
Запускаем контейнер от пользователя с минимальными правами (обычно это
Определяем команду для запуска контейнера. Не забудьте заменить
Вот и всё! Минимальный, безопасный и продакшен-готовый контейнерный образ Go.
👉 @juniorGolang
Одна из причин, по которой я люблю Go, — это простота сборки и контейнеризации. Однако важно, чтобы продакшен-приложение имело минимальную поверхность атаки, было портативным и занимало мало места.
Давайте разберёмся, как этого добиться.
1. Используем многоступенчатую сборку
FROM golang:1.24.0-bullseye AS builder
Берём официальный образ Go 1.24.0 и называем этот этап
builder. Мы создаём многоступенчатый Docker-образ, поскольку Go компилируется в бинарный файл, и сам Go нам для работы не нужен — можно удалить зависимости после сборки.2. Копируем код проекта
COPY . /workdir
WORKDIR /workdir
Это перемещает файлы проекта в контейнер и устанавливает рабочую директорию
/workdir3. Улучшаем безопасность компиляции
ENV CGO_CPPFLAGS="-D_FORTIFY_SOURCE=2 -fstack-protector-all"
Опции компилятора C для защиты стека и предотвращения атак.
ENV GOFLAGS="-buildmode=pie"
Команда для сборки Position Independent Executable (PIE) — это добавляет дополнительный уровень безопасности
4. Используем distroless-образ для финального контейнера
FROM gcr.io/distroless/base-debian11:nonroot
На этом этапе мы используем Distroless вместо обычного Linux-образа.
5. Копируем собранный бинарник
COPY --from=builder /workdir/app /bin/app
Переносим скомпилированный Go-файл в финальный образ. Замените
app на имя вашего основного Go-файла.6. Запускаем контейнер с минимальными привилегиями
USER 65534
Запускаем контейнер от пользователя с минимальными правами (обычно это
nobody), что повышает безопасность.ENTRYPOINT ["/bin/app"]
Определяем команду для запуска контейнера. Не забудьте заменить
app на название вашего бинарника.Вот и всё! Минимальный, безопасный и продакшен-готовый контейнерный образ Go.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21❤6🔥3
This media is not supported in your browser
VIEW IN TELEGRAM
HTTP-туннель без зависимостей, с возможностью самостоятельного хостинга и кроссплатформенной поддержкой, который открывает ваш localhost для всего мира через публичный URL. Написан на Go
👉 https://github.com/yusuf-musleh/mmar
👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2
Go-реализация протокола Model Context Protocol (MCP), обеспечивающая бесшовную интеграцию между LLM-приложениями и внешними источниками данных и инструментами
В последнее время MCP набирает популярность, и этот простой пример хорошо подходит для изучения
https://github.com/mark3labs/mcp-go
👉 @juniorGolang | #ресурсы
В последнее время MCP набирает популярность, и этот простой пример хорошо подходит для изучения
https://github.com/mark3labs/mcp-go
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - mark3labs/mcp-go: A Go implementation of the Model Context Protocol (MCP), enabling seamless integration between LLM applications…
A Go implementation of the Model Context Protocol (MCP), enabling seamless integration between LLM applications and external data sources and tools. - mark3labs/mcp-go
👍6❤1🌭1