Golang Portal
8.05K subscribers
419 photos
26 videos
7 files
450 links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Golang-разработчика

Связь: @devmangx
Download Telegram
Концепции, которые должен знать каждый разработчик: параллелизм — это НЕ конкурентность

Параллелизм и конкурентность — два термина, которые часто вызывают путаницу.

Как метко заметил Роб Пайк (один из создателей GoLang): «Конкурентность — это про управление множеством задач одновременно. Параллелизм — это про выполнение множества задач одновременно.»

Один термин связан с управлением несколькими задачами одновременно, чередуя их для оптимизации использования ресурсов.

Другой — с одновременным выполнением нескольких задач, обычно на нескольких процессорах или ядрах.

Что такое конкурентность?
Управление несколькими задачами на одном процессоре, чередуя их таким образом, чтобы создавалось впечатление одновременного выполнения, называется конкурентностью.

Это относится к способности системы переключаться между несколькими задачами, а не выполнять их одновременно, создавая иллюзию параллельного выполнения.

Конкурентность эффективно использует процессорное время, особенно когда задачи вынуждены ждать завершения других.

Что такое параллелизм?
Параллелизм подразумевает выполнение нескольких задач одновременно.

Это достигается за счет эффективного использования нескольких процессоров или ядер в вычислительной системе.

Различие между конкурентностью и параллелизмом напрямую влияет на производительность и эффективность приложений.

Поскольку параллелизм поддерживает одновременное выполнение задач, он особенно полезен для вычислительно-интенсивных приложений, которые распределяют задачи по нескольким процессорам.

Асинхронное программирование
Асинхронное программирование используется для достижения конкурентности в однопоточных средах.

Этот подход позволяет программе запускать задачи без ожидания завершения предыдущих, управляя несколькими задачами в неблокирующем режиме.

Отличный пример — Node.js, который обрабатывает конкурентность в однопоточной модели с помощью обратных вызовов и циклов событий.

Между тем, многопоточные среды поддерживают как конкурентность, так и параллелизм.

Они позволяют выполнять задачи конкурентно на одном процессоре, а также обеспечивают истинный параллелизм на нескольких процессорах или ядрах одновременно.

Многопоточные языки программирования, такие как C#, предоставляют разработчикам возможность использовать эти функции.

Понимание различий между конкурентностью и параллелизмом — это важный аспект при создании высокопроизводительных и эффективных программных решений.

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍114🔥3🤯1
Простое веб-приложение, которое демонстрирует случайные репозитории на GitHub, написанные на Go

👉 github.com/Glup3/gorepos

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍142
Параллельный шаблон потоковой обработки в Go: как значительно быстрее сканировать большие хранилища S3 или GCS

Статья объясняет, как ускорить перечисление файлов в S3 и GCS, используя параллельную обработку в Go.

Стандартные методы обходят файлы последовательно, что замедляет процесс при работе с миллионами объектов. Автор предлагает разбивать пространство имен бакета на диапазоны и обрабатывать их горутинами, сокращая время сканирования.

В статье приводится пример реализации с библиотекой Rill, а также советы по настройке количества потоков для максимальной производительности.

👉 Подробности можно найти здесь

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
⚙️ Клон Minecraft с нуля, используя только современный OpenGL и Go

https://github.com/GianlucaP106/minecraft

👉 @juniorGolang | #ресурсы
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татья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍84🤯3
Знали ли вы, что можно проанализировать любой Go-бинарник и узнать, с какой версией Go он был собран?

Команда go version -m <file> делает именно это, а также показывает другую полезную информацию о сборке.

Очень пригодится при отладке бинарников, отправленных в продакшен 👍

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍171
Конструктор схем для Go для разбора и валидации значений во время выполнения. Определяйте схемы, преобразовывайте значения, проверяйте соответствие структурам или выполняйте и то, и другое.

Схемы Zog выразительны, что позволяет выполнять сложную валидацию или трансформации.

👉 GitHub: https://github.com/Oudwins/zog

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Как реализовать аутентификацию JWT в вашем Golang API

Статья описывает внедрение JWT-аутентификации в API на Go с использованием https://github.com/golang-jwt/jwt

Рассматриваются преимущества JWT, разделение на Access и Refresh токены для управления сессиями, а также приводится практическая реализация.

👉 Подробности можно найти здесь

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
Создание контейнерного образа golang для продакшена

Одна из причин, по которой я люблю Go, — это простота сборки и контейнеризации. Однако важно, чтобы продакшен-приложение имело минимальную поверхность атаки, было портативным и занимало мало места.

Давайте разберёмся, как этого добиться.

1. Используем многоступенчатую сборку
FROM golang:1.24.0-bullseye AS builder

Берём официальный образ Go 1.24.0 и называем этот этап builder. Мы создаём многоступенчатый Docker-образ, поскольку Go компилируется в бинарный файл, и сам Go нам для работы не нужен — можно удалить зависимости после сборки.
🔹Подробнее: Docker multi-stage build

2. Копируем код проекта
COPY . /workdir
WORKDIR /workdir

Это перемещает файлы проекта в контейнер и устанавливает рабочую директорию /workdir

3. Улучшаем безопасность компиляции
ENV CGO_CPPFLAGS="-D_FORTIFY_SOURCE=2 -fstack-protector-all"

Опции компилятора C для защиты стека и предотвращения атак.
🔹 Подробнее: Stack protection in GCC & Clang

ENV GOFLAGS="-buildmode=pie"

Команда для сборки Position Independent Executable (PIE) — это добавляет дополнительный уровень безопасности

4. Используем distroless-образ для финального контейнера
FROM gcr.io/distroless/base-debian11:nonroot

На этом этапе мы используем Distroless вместо обычного Linux-образа.
🔹 Почему это важно? Distroless-образы меньше, безопаснее и не содержат ненужных пакетов. Подробнее: GoogleContainerTools/distroless

5. Копируем собранный бинарник
COPY --from=builder /workdir/app /bin/app

Переносим скомпилированный Go-файл в финальный образ. Замените app на имя вашего основного Go-файла.

6. Запускаем контейнер с минимальными привилегиями
USER 65534

Запускаем контейнер от пользователя с минимальными правами (обычно это nobody), что повышает безопасность.
ENTRYPOINT ["/bin/app"]

Определяем команду для запуска контейнера. Не забудьте заменить app на название вашего бинарника.


Вот и всё! Минимальный, безопасный и продакшен-готовый контейнерный образ Go.

👉 @juniorGolang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍216🔥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
👍92
Go-реализация протокола Model Context Protocol (MCP), обеспечивающая бесшовную интеграцию между LLM-приложениями и внешними источниками данных и инструментами

В последнее время MCP набирает популярность, и этот простой пример хорошо подходит для изучения

https://github.com/mark3labs/mcp-go

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61🌭1
Анонсирован порт TypeScript на Go, который показывает двухкратное уменьшение использования памяти и десятикратное улучшение скорости работы

В этой статье разбор в деталях часового интервью с автором TypeScript Андерсом Хейлсбергом об этом портировании

👉 Читать

Официальный репозиторий: GitHub

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥4
Go-пакет, который преобразует CSV-файл в базу данных SQLite в памяти, позволяя выполнять SQL-запросы к CSV-файлу

👉 https://github.com/sionpixley/inquiry

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯10👍42
Что Go сделал правильно, а Rust — нет

​Статья обсуждает преимущества языка программирования Go по сравнению с Rust, особенно в контексте недавнего решения Microsoft переписать компилятор и инструментарий TypeScript с JavaScript на Go для достижения 10-кратного повышения производительности.

В статье выделяются ключевые аспекты, в которых Go превосходит Rust

👉 Читать

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
10🤔6👍2👎1
Как создать безопасный менеджер сессий на Go

Автор указывает на ограничения cookies (размер, уязвимость) и предлагает серверные сессии, где уникальный идентификатор хранится в cookie, а данные — на сервере.

Для повышения безопасности реализуется:
🔹Генерация 256-битных идентификаторов сессий (base64).
🔹Интерфейс SessionStore для разных хранилищ.
🔹Методы создания, чтения, обновления и удаления сессий.
🔹Защищенные cookies (HttpOnly, Secure, SameSite).

Также рассмотрены механизмы защиты от фиксации сессий и автоматического завершения неактивных сессий

👉 Читать

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
⚙️ Airo

Развертывайте свои проекты напрямую с вашего локального компьютера на продакшен-сервер с легкостью.

Airo помогает разворачивать контейнеры на вашем собственном сервере без необходимости настраивать пайплайны, серверлесс-сервисы или разные платформы. Только ваши серверы

https://github.com/bypirob/airo

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
💡 Улучшаем отладочный вывод с %+v и %q вместо %v и %s.

При отладке более четкий и детализированный вывод логов может быть очень полезен.

Возьмем типичную ситуацию, когда вы быстро проверяете состояние структуры с помощью fmt.Println:
fmt.Println(GameStats{30, 15, 5})

Вывод:
{30 15 5}

Здесь не сразу понятно, какое число относится к Wins, какое к Losses, а какое к Draws,

...если только вы не помните порядок полей в структуре.

Но, используя %+v и %#v, которые являются вариациями %v, можно сделать вывод более информативным и удобочитаемым:
🔹%+v включает имена полей прямо в вывод, устраняя любую двусмысленность.
🔹%#v идет еще дальше, показывая полную структуру с пакетом и типом. Это может быть избыточным в повседневных сценариях, но полезно в сложных случаях.

"А как насчет %q?"


%q — это, по сути, способ обернуть строки в кавычки, тогда как %s просто выводит строку как есть.

Это различие может быть полезным, особенно при работе с:
🔹Пустыми строками
🔹Строками, содержащими специальные символы или пробелы, которые не сразу заметны

Просто посмотрите на логи, сгенерированные разными форматами, и обратите внимание, насколько понятнее становятся проблемы при использовании %q.

"А есть ли недостатки?"


Стоит учитывать, что %q не интерпретирует управляющие последовательности, такие как \t или \n, что может сделать строку менее читаемой.

(Хотя это может быть полезно, поскольку позволяет увидеть строку в точности такой, какая она есть, сохраняя все специальные символы.)

👉 @juniorGolang | #tip
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍156🔥4