Каналы в Go легко использовать неправильно, если не знать правил:
- Отправка в канал вызывает панику, если канал закрыт в любой момент до фактического завершения отправки, даже если закрытие произошло после начала отправки, но до её завершения.
- Чтение из закрытого канала никогда не приводит к панике.
- Закрытие nil-канала или уже закрытого канала вызывает панику.
Эти правила подсказывают простую модель владения:
Сторона, которая “владеет” жизненным циклом канала (обычно отправитель), должна быть единственной, кто имеет право закрывать канал, и должна сделать это ровно один раз, после того как все отправки завершены.
Потребители обычно не должны вызывать close.
Если у вас несколько отправителей, им нужно координироваться так, чтобы только один из них фактически выполнял закрытие. Обычный паттерн - обернуть close(ch) в sync.Once или направить все отправки через одну горутину, которая и становится единственным закрывающим, когда знает, что больше значений не будет.
👉 @GolangPortal
- Отправка в канал вызывает панику, если канал закрыт в любой момент до фактического завершения отправки, даже если закрытие произошло после начала отправки, но до её завершения.
- Чтение из закрытого канала никогда не приводит к панике.
- Закрытие nil-канала или уже закрытого канала вызывает панику.
Эти правила подсказывают простую модель владения:
Сторона, которая “владеет” жизненным циклом канала (обычно отправитель), должна быть единственной, кто имеет право закрывать канал, и должна сделать это ровно один раз, после того как все отправки завершены.
Потребители обычно не должны вызывать close.
Если у вас несколько отправителей, им нужно координироваться так, чтобы только один из них фактически выполнял закрытие. Обычный паттерн - обернуть close(ch) в sync.Once или направить все отправки через одну горутину, которая и становится единственным закрывающим, когда знает, что больше значений не будет.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤8🔥3
Принято! Go 1.26 введёт метрики по состояниям горутин: выполняются, ожидают, в системных вызовах и т.д.
Разработчики смогут использовать их для раннего выявления проблем без необходимости полной трассировки
Подробнее тут
👉 @GolangPortal
Разработчики смогут использовать их для раннего выявления проблем без необходимости полной трассировки
Подробнее тут
Please open Telegram to view this post
VIEW IN TELEGRAM
👍37❤6🔥3
Если вы серьёзно занимаетесь Go, вам нужно подтянуть свой скилл в тестировании.
Эти слайды от со-основателя HashiCorp — одно из лучших материалов для изучения:
https://speakerdeck.com/mitchellh/advanced-testing-with-go
👉 @GolangPortal
Эти слайды от со-основателя HashiCorp — одно из лучших материалов для изучения:
https://speakerdeck.com/mitchellh/advanced-testing-with-go
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍3👎2
Лёгкое, self-hosted приложение для личных финансов с удобным интерфейсом и мощным функционалом для бухгалтерского учёта.
Бэкенд на Go
GitHub: ezbookkeeping
👉 @GolangPortal
Бэкенд на Go
GitHub: ezbookkeeping
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍7❤4👀1
Изучите эволюцию стратегий кеширования в разработке ПО, чтобы понять, как разные подходы помогают повысить производительность и снизить задержки в ваших приложениях.
В этой статье – детальное погружение в мир кеширования:
https://maypok86.github.io/otter/blog/cache-evolution/
👉 @GolangPortal
В этой статье – детальное погружение в мир кеширования:
https://maypok86.github.io/otter/blog/cache-evolution/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤4🔥3
При выполнении запросов к базе данных в Go используйте
👉 @GolangPortal
& в rows.Scan(), чтобы передавать адреса, а не значения.Scan() нужно иметь возможность записывать данные напрямую в поля вашей структурыPlease open Telegram to view this post
VIEW IN TELEGRAM
❤9👍3😁2👎1
Современный, готовый к продакшену Go REST API для аутентификации и авторизации, включающий социальный логин, верификацию email, работу с JWT и интеграцию с Redis
https://github.com/gjovanovicst/golang-auth-api
👉 @GolangPortal
https://github.com/gjovanovicst/golang-auth-api
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤2🔥2
Принято! В Go 1.26 появится
Никакого reflection. Никаких рантайм-паник. Лаконичный код. Это мощно✌️
https://antonz.org/accepted/errors-astype/
👉 @GolangPortal
errors.AsType – современная, типобезопасная альтернатива громоздкому errors.As.Никакого reflection. Никаких рантайм-паник. Лаконичный код. Это мощно
https://antonz.org/accepted/errors-astype/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤24👍8
Упрощает конфигурацию Go-приложений через переменные окружения. В локальной разработке можно использовать файл .env с парами ключ/значение. В продакшене значения подтягиваются из secret manager.
GitHub: dotconfig
👉 @GolangPortal
GitHub: dotconfig
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔1
Вышли Go 1.25.5 и 1.24.11!
- Безопасность: Включают патчи для уязвимостей в crypto/x509 (CVE-2025-61729, CVE-2025-61727).
- Анонс: https://groups.google.com/g/golang-announce/c/8FJoBkPddm4/m/kYpVlPw1CQAJ
- Скачать: https://go.dev/dl/#go1.25.5
👉 @GolangPortal
- Безопасность: Включают патчи для уязвимостей в crypto/x509 (CVE-2025-61729, CVE-2025-61727).
- Анонс: https://groups.google.com/g/golang-announce/c/8FJoBkPddm4/m/kYpVlPw1CQAJ
- Скачать: https://go.dev/dl/#go1.25.5
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍7🔥3
Ключевые Go-паттерны, справочник по стандартной библиотеке и интерактивные примеры
https://app.gointerview.dev/cheatsheet
👉 @GolangPortal
https://app.gointerview.dev/cheatsheet
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥10❤4👎1
GitHub теперь в Telegram!
Самый прогерский канал, где за 10 минут ты научишься:
/ Пробив по фото и номеру в ТГ
// Как взломать вебку подруги
/// Мануал по OSINT разведке
Подписывайся, нас уже сотни тысяч: >@GitHub
Самый прогерский канал, где за 10 минут ты научишься:
/ Пробив по фото и номеру в ТГ
// Как взломать вебку подруги
/// Мануал по OSINT разведке
Подписывайся, нас уже сотни тысяч: >@GitHub
👎10👍1
Многие статьи заставляют думать, что
Go держит пул переиспользуемых горутин на каждый процессор и глобальный пул, причём у части горутин в этих пулах уже есть прикреплённые стеки, а у части нет (см. диаграмму ниже)
Рантайм поддерживает динамический “начальный размер стека”, который пересчитывается в каждом цикле сборки мусора исходя из среднего использования стека всеми просканированными горутинами
Когда вы вызываете
Если размер стека повторно используемой горутины отличается от текущего “начального размера стека”, её старый стек освобождается, и ей выделяется новый стек ровно текущего начального размера.
Если подходящей повторно используемой горутины нет, рантайм выделяет новую с фиксированным начальным стеком 2 KiB ( на большинстве 64-битных Unix-подобных платформ)
👉 @GolangPortal #tip by Phuong Le
go func() {} всегда создаёт горутину с 2 KiB стека. Иногда так и есть, но далеко не всегда.Go держит пул переиспользуемых горутин на каждый процессор и глобальный пул, причём у части горутин в этих пулах уже есть прикреплённые стеки, а у части нет (см. диаграмму ниже)
Рантайм поддерживает динамический “начальный размер стека”, который пересчитывается в каждом цикле сборки мусора исходя из среднего использования стека всеми просканированными горутинами
Когда вы вызываете
go f(), рантайм может взять горутину и стек из пулов, поэтому многие горутины на самом деле стартуют с размером стека больше фиксированного минимума 2 KiB – например, 4 KiB, 8 KiB, 16 KiB и так далее.Если размер стека повторно используемой горутины отличается от текущего “начального размера стека”, её старый стек освобождается, и ей выделяется новый стек ровно текущего начального размера.
Если подходящей повторно используемой горутины нет, рантайм выделяет новую с фиксированным начальным стеком 2 KiB ( на большинстве 64-битных Unix-подобных платформ)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍6