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

Связь: @devmangx
Download Telegram
Создание контейнерного образа 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
⚙️ Система конкурентных очередей с использованием каналов и горутин, поддерживающая как FIFO, так и приоритетные операции, с возможностью возврата результатов и безвозвратных (void) очередей

https://github.com/fahimfaisaal/gocq

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Управляем множеством горутин с errgroup

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

Ты, наверное, знаком с sync.WaitGroup, да? Но есть пакет errgroup, который упрощает эту задачу.

В примере мы загружаем две страницы и ждем их завершения с g.Wait().

errgroup помогает управлять несколькими горутинами и обрабатывать ошибки, которые они могут вернуть.

Три ключевых момента:

🔹Для параллельного выполнения задач используй g.Go(), передавая в него функцию.
🔹g.Wait() ждет завершения всех горутин и возвращает первую возникшую ошибку (но не все сразу).
🔹errgroup хорошо работает с контекстом.

При использовании errgroup.WithContext() в случае ошибки контекст отменяется.

Как это работает внутри
1. Group использует несколько механизмов:
🔹sync.WaitGroup — чтобы дождаться завершения всех горутин.
🔹sync.Once — чтобы безопасно сохранить первую ошибку.
🔹Семафорный chan — для ограничения числа одновременно работающих горутин (можно задать лимит через errg.SetLimit()).

2. errg.done() — вспомогательная функция, которая помечает горутину завершенной.
🔹Уменьшает счетчик активных горутин (если установлен лимит).
🔹Сообщает WaitGroup, что горутина завершилась.

3. Ошибки обрабатываются централизованно.
🔹С помощью errOnce фиксируется только первая ошибка, которая затем приводит к остановке и возвращается через Wait().

И да, горутины — это не всегда лучшее решение. Если задачи быстрые, последовательное выполнение может быть эффективнее

👉 @juniorGolang | #tip
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍111
Опенсорсное, самохостовое решение для ведения заметок, разработанное для удобного развертывания и кроссплатформенного доступа.

GitHub: https://github.com/usememos/memos

👉 @juniorGolang | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍43
Гайд для новичков по запуску приложения на Go + React в Docker

Он охватывает настройку окружения, создание простых примеров Go API и приложения React, а также настройку Nginx.

🔜 Читать

👉 @juniorGolang | #cтатья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍116
В Go 1.24 появился новый struct тег omitzero в encoding/json, который позволяет автоматически пропускать поля с нулевыми значениями.

Интересно то, что для него можно определить собственный метод IsZero().

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

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