TGViewer
Channel Public Channel
Библиотека Go-разработчика | Golang

Библиотека Go-разработчика | Golang

@goproglib

Все самое полезное для Go-разработчика в одном канале.

Учиться у нас: clc.to/qaSdww

По рекламе: @tproger_sales_bot

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a4a8c24689c2151c752af0

Заявка: 8137752389
Subscribers
24.1K
Photos
2.8K
Videos
54
Links
5.4K

Showing posts older than #7242 · Back to latest

Older Posts 20 shown
Post #7241 2.82K

Forwarded from Азбука айтишника

👀 9 правил микросервисной архитектуры

На схеме 9 "золотых" правил. А вот про некоторые:

Separate data store
— У каждого сервиса своя база. Итог: независимость, но ад при попытке сделать общую аналитику.

Single responsibility
— Один сервис, одна задача. Итог: чистая логика, но если переборщить, получишь сотни мелких скриптов, которые невозможно отследить.

Treat servers as stateless
— Сервер не должен ничего помнить о прошлых запросах. Итог: легкое масштабирование, но всю логику сессий приходится выносить во внешние хранилища.

Domain-driven design (DDD)
— Строим архитектуру вокруг бизнес-задач. Итог: код понятен бизнесу, но проектирование занимает в разы больше времени.

Orchestrating microservices
— Используем Kubernetes для управления. Итог: автоматизация деплоя, но порог входа в инфраструктуру улетает в космос.

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

Соблюдаете все 9 правил в своих проектах?

❤️ — стараемся следовать базе
🔥 — пилим как быстрее, а не "по книжке"

🔹 Практический интенсив «Архитектуры и шаблоны проектирования»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🏃‍♀️ Азбука айтишника

#ликбез
  • ❤ 13
  • 🔥 9
Post #7240 2.92K
🤩 Краулер для разведки по веб приложениям

Обычный краулер видит сырой HTML и пропускает всё, что появляется уже в DOM. Katana от команды ProjectDiscovery решает эту задачу. Это краулер на Go, который собирает ссылки и эндпоинты, в том числе из JS, и умеет ходить по сайту через настоящий браузер.

Katana принимает на вход один URL, список из файла или поток через stdin, обходит цель и отдаёт найденные эндпоинты в текст, файл или JSON.

У него два режима работы:

• Стандартный использует обычный HTTP клиент Go и работает быстро, но видит только сырой ответ.

• Режим headless поднимает Chrome, выполняет JavaScript и находит эндпоинты, которые появляются после рендера или асинхронных запросов.

Дополнительно инструмент парсит ссылки внутри JS файлов, умеет автоматически заполнять формы, контролирует область обхода через scope и regex, фильтрует вывод по расширениям и условиям. Есть встроенное определение технологий и обход с авторизацией через свои заголовки или куки.

Как это работает

Базовый запуск по одной цели:
katana -u https://example.com


Список целей из файла:
katana -list urls.txt


Поток через pipe, например из httpx:
echo https://example.com | katana


Режим headless с разбором JavaScript находит больше эндпоинтов на динамических сайтах:
katana -u https://example.com -headless -jc


Контроль области обхода. Флаг -fs dn держит краулер в пределах домена по ключевому слову:
katana -u https://example.com -fs dn


Вывод в JSON с записью в файл удобен для дальнейшей обработки в пайплайне:
katana -u https://example.com -jsonl -o endpoints.jsonl


Запускать Katana можно и как библиотеку Go. Создаёте структуру Options, передаёте те же параметры, что и в CLI, и вызываете метод Crawl.

Колбэк OnResult получает каждый найденный результат:
options := &types.Options{
MaxDepth: 3,
FieldScope: "rdn",
Concurrency: 10,
Strategy: "depth-first",
OnResult: func(result output.Result) {
gologger.Info().Msg(result.Request.URL)
},
}
crawlerOptions, _ := types.NewCrawlerOptions(options)
crawler, _ := standard.New(crawlerOptions)
crawler.Crawl("https://example.com")


Кому пригодится

Katana пригодится пентестерам, специалистам по bug bounty и инженерам по безопасности для сбора поверхности атаки. Инструмент собирает пути, параметры и файлы, из которых потом строят словари и списки целей для других сканеров.

Важно помнить, что краулер шлёт реальные запросы к цели. Запускайте его только по тем доменам, на тестирование которых у вас есть разрешение.

Если работаете с разведкой по вебу и сидите на стеке ProjectDiscovery, Katana встаёт в пайплайн рядом с subfinder и httpx. Быстрый стандартный режим закрывает простые сайты, headless вытягивает динамику.

➡️ Репозиторий

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика

#GoToProduction
  • ❤ 2
  • 👍 1
Post #7239 2.93K
✏️ Go наводит порядок в флагах GODEBUG

Команда Go опубликовала предложение с политикой устаревания и удаления флагов GODEBUG. Это обсуждение задаёт правила, по которым старые флаги будут помечать устаревшими, а потом убирать из дистрибутива.

Сами флаги появились как способ смягчить переход между версиями. Гарантия совместимости Go 1 обещает, что рабочий код продолжит собираться и работать, но иногда исправления безопасности всё же меняют поведение программ. Чтобы дать время на адаптацию, ввели переменную GODEBUG.

Например, в Go 1.21 вызов panic(nil) стал ошибкой времени выполнения, а флаг panicnil=1 возвращает старое поведение Go 1.20. За 13 лет таких флагов накопилось много, и каждый из них это точка расхождения в поведении тулчейна. Это усложняет тестирование и поднимает стоимость поддержки.

Что предлагают

Предложение делит флаги на четыре категории по сложности удаления.

Самые простые уже удалены раньше, как x509sha1.

Дальше идут флаги с заранее объявленной датой удаления, например gotypesalias, который можно убрать не раньше Go 1.27.

Третья группа это флаги без даты удаления и без статуса постоянных, им сначала назначат дату.

Четвёртая и самая сложная группа это флаги, объявленные постоянными, как netdns, для их удаления нужно отдельное обоснованное предложение.

Сам процесс устроен так: в релизе перед удалением флаг помечают устаревшим и объявляют об удалении в следующей версии. Если серьёзных возражений нет, флаг убирают. Если кто-то покажет критическую зависимость от старого поведения, удаление откладывают на один релизный цикл. Флаги, добавленные ради совместимости, обязаны жить минимум два года.

Как это сделают технически

Внутренний пакет godebug получает статус флага:
type FlagStatus int
const (
Active FlagStatus = iota
Deprecated
Removed
)


Сборочные инструменты будут предупреждать об устаревших флагах, а тесты сообщать об ошибке. Предлагается и новый флаг deprecatedgodebug=0, который заставит программу упасть с паникой при попытке выставить устаревший флаг в недефолтное значение.

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

Пока это предложение на стадии обсуждения, а не финальное решение. Связанный тикет #75316 уже применяет новую логику и предлагает убрать набор крипто флагов из Go 1.23 и раньше в релизе Go 1.27. Если вы держите в go.mod строки с GODEBUG, стоит следить за заметками к релизам, чтобы не словить фатальную ошибку после обновления.

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика

#GoLive
  • ❤ 4
Post #7237 3.13K
🤩 Десктопные приложения на Go и веб технологиях

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

Wails позволяет писать бэкенд на обычном Go, а интерфейс на любом знакомом стеке, будь то React, Vue, Svelte, Angular или чистый JavaScript. Методы Go доступны из JavaScript напрямую, без ручного описания протокола.

Для структур и методов автоматически генерируются типы TypeScript, поэтому фронтенд видит сигнатуры функций. В комплекте идут нативные диалоги и меню, поддержка тёмной и светлой темы, эффекты прозрачности окна.

Главное отличие от Electron в рендеринге. Wails использует системный движок WebView вместо вкомпиленного Chromium. За счёт этого бинарник весит единицы мегабайт, а не сотни.

Как это работает

Проверить окружение и зависимости помогает встроенная команда. Она подскажет, чего не хватает в системе:
wails doctor


Создаём проект из шаблона. Флаг -t задаёт фронтенд, флаг -n имя проекта:
wails init -n myapp -t svelte


Дальше работаем в режиме разработки с горячей перезагрузкой фронтенда:
wails dev


Финальная сборка под текущую платформу собирает один бинарник:
wails build


Теперь про связку Go и JavaScript. Любой метод структуры, привязанной к приложению, становится доступен фронтенду.

Вот пример на Go:
type App struct {
ctx context.Context
}

func (a *App) Greet(name string) string {
return fmt.Sprintf("Привет, %s!", name)
}


На стороне фронтенда Wails сам сгенерирует обёртку, и вызов выглядит как обычная асинхронная функция:
import {Greet} from '../wailsjs/go/main/App'

Greet("мир").then((result) => {
console.log(result)
})

Метод возвращает строку из Go, а JavaScript получает её через промис. Никакого ручного REST или WebSocket слоя писать не нужно.

Если вы знакомы с веб фронтендом, порог входа низкий. Вы остаётесь в привычном стеке, а на выходе получаете лёгкое нативное приложение одним файлом.

➡️ Репозиторий

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика

#GoToProduction
  • 👍 16
  • ❤ 2
  • 👾 1
Post #7236 3.07K
⚡️ Последний шанс забрать курсы со СКИДКОЙ 40%! Прокачайте свой мозг правильно

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

➡️ Разработка AI-агентов — от 49 000 ₽ (вместо 69 000 ₽)
Курс про контролируемую разработку ИИ-агентов: качество, стоимость, наблюдаемость и тестирование. С первого занятия — только практическая работа.

➡️ Курс AgentOps — 129 000 ₽ (вместо 149 000 ₽)
Профессиональный трек для разработчиков и LLM инженеров о том, как правильно внедрять AI-логику в бэкенд и сохранять железную стабильность сервиса.

➡️ Математика для Data Science — от 29 990 ₽ (вместо 39 990 ₽)
Вы научитесь решать сложные математические задачи, которые дают на собеседованиях на позицию дата-сайентиста в бигтехе. Отличная база для мощного старта в DS.

➡️ Курс Специалист по ИИ — 89 000 ₽ (вместо 113 900 ₽)
Комплексная программа для получения профессии в сфере ИИ с нуля. За 8 месяцев вы соберете сильное портфолио из 5 реальных проектов и дипломной работы.

➡️ Архитектуры и шаблоны проектирования — 27 990 ₽ (вместо 37 900 ₽)
Интенсив для разработчиков, который поможет освоить основные паттерны проектирования и прокачать навыки архитектора программного обеспечения.

🌸 Выбирайте направление, оставляйте заявку на сайте распродажи, и наш менеджер подробно вас проконсультирует
  • ❤ 3
  • 🥱 3
Post #7235 3.07K
🧑‍💻 Cервер обработки изображений на Go

imagor — HTTP-сервер на Go поверх libvips для трансформации изображений на лету. Параметры передаются прямо в URL — никакого кода писать не нужно. Поддерживает загрузку из HTTP, S3, GCS и файловой системы, кэширует обработанные результаты в Result Storage.

Параметры трансформации передаются прямо в URL. Поддерживает загрузку из HTTP, S3, GCS и файловой системы, кэширует обработанные результаты.

Как запустить
docker run -p 8000:8000 shumc/imagor -imagor-unsafe -imagor-auto-webp


Запрос выглядит так:
http://localhost:8000/unsafe/fit-in/200x200/filters:fill(white)/https://example.com/photo.jpg


Примеры фильтров

Ресайз с умной обрезкой и конвертацией:
/unsafe/200x200/smart/filters:format(jpeg):quality(80)/photo.png


Вотермарк по всей нижней части:
/unsafe/fit-in/200x150/filters:fill(yellow):watermark(logo.png,repeat,bottom,0,40,40)/photo.gif


Основные фильтры: blur, format, quality, fill, watermark, grayscale, rotate, strip_metadata, label. Применяются пайплайном через двоеточие.

Безопасность

В продакшне отключаем IMAGOR_UNSAFE и подписываем URL через IMAGOR_SECRET. Подпись на HMAC-SHA1 (или SHA256/SHA512), хэш в base64url добавляется в начало пути. Дополнительно ограничиваем источники и размеры входящих изображений:
HTTP_LOADER_ALLOWED_SOURCES=*.example.com
VIPS_MAX_RESOLUTION=16800000
VIPS_MAX_WIDTH=5000


➡️ Репозиторий

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика

#GoToProduction
  • ❤ 2
  • 👍 1
Post #7234 3.08K
💸 Работать надо не 8 часов, а на валютной удалёнке

Ещё пару лет назад казалось, что работа на зарубежную компанию это мечта только для матёрых сеньоров. Сейчас картина другая: джуны с английским находят оффер быстрее, чем мидл на hh.ru.

Но и ловушек стало больше — прямой найм почти умер, компании всё чаще проверяют происхождение кандидатов, а Европа уступила место ОАЭ и Сингапуру.

➡️ 5 главных трендов, которые определяют рынок

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика
  • 😁 7
  • ❤ 3
  • 🥱 3
Post #7233 2.8K

Forwarded from Азбука айтишника

Типичный стек микросервисов

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

Разберем схему, что там реально происходит:

➡️ Pre-Production:

Здесь создается фундамент:

- API First: Сначала описываем контракты (OpenAPI/Postman), и только потом пишем код.
- Разделение труда: Пока фронты пилят UI на React, бэкенд упаковывает логику в микросервисы на Java/Node.js.
- CI/CD: Тесты (JUnit), упаковка в Docker и автоматический деплой через Jenkins в Kubernetes. Итог: если этот процесс не настроен, ты будешь деплоить один баг вручную по полдня.

➡️ Production:

В реальной работе система обрастает «мясом», без которого всё упадет через 5 минут:

- Входная группа: Load Balancer (Nginx) и CDN распределяют трафик, чтобы сервер не закипел.
- API Gateway: Твой диспетчер (Spring Boot/Eureka), который рулит запросами.
- Инфраструктура: Кэш (Redis), поиск (Elasticsearch) и брокеры сообщений (Kafka). Это база, которая спасает основную БД от перегруза.
- Хранение: Забудь про одну БД. В микросервисах у тебя и классика (Postgres), и облака (S3), и тяжелая артиллерия для данных (Cassandra).

Уже собрали свой идеальный стек или пока только присматриваетесь к Docker?
❤️ — вовсю юзаем Kafka и Kubernetes
🔥 — пока держимся на одном сервере и старом добром SQL

🔹 Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

🏃‍♀️ Азбука айтишника

#ликбез
  • 🔥 7
  • 🥱 7
  • ❤ 3
Post #7232 3.11K
🦾🧠🏋️ Качаем мозги к лету!

Все готовятся к пляжному сезону, а мы предлагаем прокачать хард-скилы, чтобы забрать крутой оффер, строить продукты будущего и работать из любой точки мира 😎

⚡️ Распродажа @proglib_academy: забирайте самые актуальные образовательные треки по сниженным ценам!

➡️ Разработка AI-агентов — от 49 000 ₽ (вместо 69 000 ₽).

➡️ Курс AgentOps — 129 000 ₽ (вместо 149 000 ₽).

➡️ Математика для разработки AI-моделей — 23 990 ₽ (вместо 31 990 ₽).

➡️ ML для старта в Data Science — 28 990 ₽ (вместо 38 990 ₽).

Почему мы?

⭐️Учим для продакшена. Наши программы заточены под реальные задачи бизнеса: как не слить бюджет на токены, как заставить LLM работать стабильно в бэкенде и как выстроить отказоустойчивую архитектуру.
⭐️Спикеры — суровые практики. Вы будете перенимать опыт у действующих AI-архитекторов, тимлидов и ML-инженеров из топовых IT-компаний.
⭐️Комплексный подход. Мы даем как мощный математический фундамент для понимания моделей «под капотом», так и передовые инструменты оркестрации агентов.
⭐️Много практики и фидбека. Вебинары, десятки практических заданий и живое общение с экспертами в чате Telegram на протяжении всего обучения.

⏳ Оставляйте заявку и бронируйте место со СКИДКОЙ 40%
  • 👍 1
Post #7230 2.9K
🔥Автодокументация API в Go: Gin + Swaggo

Вы пишете API на Gin, фронтенд-команда просит документацию, а вы обновляете её вручную в Notion или Confluence. Через неделю доки расходятся с кодом, и начинается хаос. Swaggo решает эту проблему. Вы пишете комментарии прямо в коде, а он генерирует интерактивную документацию по спецификации OpenAPI.

Как это работает

Swaggo парсит специальные комментарии над хендлерами Gin и на их основе собирает swagger.json. Результат можно открыть в браузере через Swagger UI.

Устанавливаем CLI:
go install github.com/swaggo/swag/cmd/swag@latest


Добавляем зависимости в проект:
go get github.com/swaggo/gin-swagger
go get github.com/swaggo/files


Пишем хендлер с аннотациями:
// @Summary Получить профиль пользователя
// @Description Парсит токен из заголовка и возвращает данные пользователя
// @Produce json
// @Success 200 {object} profileResponse
// @Router /api/v2/account/profile [get]
func FetchProfileHandler(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"status": "ok", "data": "user_data"})
}


Подключаем Swagger UI в роутере:
import (
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
_ "your-project/docs"
)

r := gin.Default()
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))


Генерируем документацию:
swag init


После этого по адресу /swagger/index.html будет доступна интерактивная страница со всеми эндпоинтами. Фронтенд-команда видит актуальные контракты, может отправлять тестовые запросы прямо из браузера.

Что умеют аннотации

Swaggo поддерживает описание query-параметров, тела запроса, заголовков, кодов ответа и моделей данных. Всё через комментарии над функцией. Пример с параметрами:
// @Summary Список пользователей
// @Param page query int false "Номер страницы" default(1)
// @Param limit query int false "Количество на странице" default(20)
// @Success 200 {array} User
// @Router /api/v2/users [get]


Модели берутся из Go-структур. Если User определён в коде, Swaggo автоматически подтянет его поля в документацию.

Hot reload с Air

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

Установка:
go install github.com/air-verse/air@latest


Запуск в корне проекта:
air


Air следит за изменениями в .go файлах, пересобирает и перезапускает сервер. Работает быстро, конфигурируется через .air.toml. В связке с Swaggo можно добавить swag init в команду сборки, и документация будет обновляться вместе с кодом.

Gin отвечает за роутинг и производительность. Swaggo превращает комментарии в OpenAPI-документацию. Air перезапускает сервер при изменениях.

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика

#GoToProduction
  • 👍 8
  • ❤ 4
  • 🥱 3
Post #7228 3.28K
✏️ Пометить хелпер правильно

Допустим, у вас есть вспомогательная функция в тестах:
func assertEqual(t *testing.T, got, want int) {
if got != want {
t.Errorf("got %d, want %d", got, want)
}
}


Тест упал. В логе вы видите строку внутри assertEqual, а не место вызова в тесте.

Смогли исправить? Газ смотреть ответ

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика

#ReadySetGo
Post #7227 3.17K
👨‍💻 В компилятор Go предложили добавить автовекторизацию

Разработчик написал проход автовекторизации для компилятора Go на уровне SSA. Проход использует алгоритм SLP (Superword Level Parallelism) и работает поверх экспериментального GOEXPERIMENT=simd. Поддерживаются arm64 и amd64.

Компилятор сам находит в коде группы одинаковых скалярных операций и заменяет их на SIMD-инструкции. Без каких-либо правок со стороны разработчика. Например, четыре отдельных умножения float64 превращаются в два векторных.

Прототип пока консервативный: 128-битные векторы, без shuffles, без reductions, без cost model. Но уже работает на реальных кодовых базах и находит сотни мест для векторизации в etcd и самом cmd/compile.

Сообщество отнеслось с интересом, но просит бенчмарки вместо подсчёта регионов и приоритизацию модели стоимости.

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика

#GoLive
  • 👍 9
  • 🔥 5
  • ❤ 3
Post #7226 3.05K
👀 Практический курс «Разработка AI-агентов для автоматизации задач, работы и собственных проектов» со скидкой 40% до конца мая!

Мы поговорили с десятками разработчиков, учли главные боли индустрии и запускаем полностью обновленный курс «ИИ-агенты 5.0». 🎉

Что вы узнаете?

- Как радикально оптимизировать траты на токены.
- Как на практике оценивать качество и точность работы агента.
- Как «докручивать» RAG-системы без потери качества.
- Как обеспечить устойчивость агента к сбоям внешних сервисов без падения всей системы, и про многое-многое другое.

Спикеры — практики с опытом в AI и Data Science в крупных IT-компаниях, таких как Яндекс, Сбер, Raft и Газпромбанк др.

Длительность: 6–12 недель в зависимости от тарифа.

👉 Занимайте место на главном агентском интенсиве по лучшей цене
  • ❤ 1
  • 🔥 1
Post #7225 3.29K
📎 Qt-биндинги для Go под MIT-лицензией

Если вы пишете на Go и вам нужен нативный GUI, выбор невелик. Есть fyne, есть gio, есть веб-обёртки. Но если нужен полноценный Qt с виджетами, диалогами, таблицами и всей экосистемой — до недавнего времени единственным рабочим вариантом был therecipe/qt. У него LGPL-лицензия, нет поддержки Go-модулей, нет Qt 6, и архитектура через IPC с отдельным C++-бинарником.

MIQT — это прямые биндинги Qt 5.15 и Qt 6.4+ через CGO, под лицензией MIT. Никаких промежуточных процессов, никаких рантайм-зависимостей от авторских серверов. Вы вызываете Qt напрямую из Go-кода.

Что внутри

Биндинги покрывают QtCore, QtGui, QtWidgets, QtMultimedia, QtNetwork, QtWebEngine, QtCharts, QML, и ещё десяток модулей. Есть поддержка subclassing (можно переопределять виртуальные методы вроде PaintEvent), собственная реализация uic и rcc для работы с Qt Designer, и инструмент miqt-docker для кросс-компиляции.

Проект стартовал в августе 2024, но уже набрал 600+ звёзд и оброс реальными приложениями: менеджер Docker-контейнеров, просмотрщик JSON, загрузчик видео, RTSP-клиент для камер.

Как выглядит код

API максимально приближен к оригинальному Qt C++. Контейнерные типы Qt (QString, QList, QMap) проецируются в нативные Go-типы: string, []T, map[K]V. Сигналы и слоты работают через коллбэки:
button := qt.NewQPushButton2("Нажми меня")
button.OnClicked(func() {
qt.QMessageBox_Information(
window,
"Привет",
"Это MIQT",
)
})


Наследование классов Qt реализовано через встраивание структур. Чтобы передать *qt.QLabel в функцию, принимающую *qt.QWidget, пишете myLabel.QWidget.

Платформы

MIQT работает на Linux (x86_64, ARM64), Windows (x86_64), macOS (x86_64, ARM64), FreeBSD и Android. Поддерживается и статическая, и динамическая линковка. Для Windows и Android есть готовые Docker-образы для кросс-компиляции.

Нюансы, о которых стоит знать

Первая сборка занимает около 10 минут. Все последующие быстрые, потому что CGO-часть кешируется. На Go 1.26 стало ещё быстрее.

Бинарник по умолчанию получается большим. С флагами -ldflags "-s -w" helloworld уменьшается с 43MB до 6MB. С upx --best — до 2MB.

Сравнение указателей на Qt-объекты в Go работает не так, как в C++. QTabWidget.CurrentWidget() каждый раз создаёт новую Go-структуру, оборачивающую тот же C++-указатель. Для сравнения используйте .UnsafePointer() или сравнивайте по индексу.

Горутины мигрируют между OS-потоками, а Qt привязывает объекты к конкретному потоку. MIQT автоматически вызывает runtime.LockOSThread() при создании QApplication. Для доступа к Qt-объектам из других горутин используйте mainthread.Wait() или mainthread.Start().

Быстрый старт на Linux

Ставим зависимости, пример для Debian/Ubuntu с Qt 6:
apt install qt6-base-dev build-essential golang-go


Собираем:
go build -ldflags '-s -w'


Для кросс-компиляции под Windows:
go install github.com/mappu/miqt/cmd/miqt-docker@latest
miqt-docker win64-qt6-static -windows-build --tags=windowsqtstatic


MIQT — это способ писать Qt-приложения на Go без лицензионных ограничений LGPL. Биндинги зрелые, покрытие API широкое, кросс-платформенность работает. Если вам нужен нативный десктопный GUI на Go с полным набором виджетов, MIQT сейчас самый практичный вариант.

➡️ Репозиторий

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика

#GoToProduction
  • 🔥 8
  • ❤ 2
Post #7223 4.8K
👨‍💻 Что делать, если go fix сломал поведение

В Go 1.26 go fix переписан с нуля. Теперь это полноценный движок модернизации: заменяет if/else на min/max, переписывает циклы на range-over-int, подставляет strings.Cut вместо strings.Index — и ещё десятки трансформаций за один запуск.

Звучит удобно. Но после go fix ./... код может сломаться или, хуже, молча изменить поведение.

Два типа конфликтов

Синтаксические — go fix ловит сам и просит запустить повторно.

Семантические — опаснее. Две независимые правки вместе могут сделать переменную неиспользуемой — и это уже ошибка компиляции. Лишние импорты инструмент уберёт сам, но с переменными придётся разбираться вручную.

Тихие изменения поведения

appendclipped заменяет append([]T(nil), s...) на slices.Clone(s). Если s пустой — Clone вернёт nil. Для JSON это разница между null и []. Анализатор по умолчанию выключен, но показательно.

slicescontains заменяет цикл на slices.Contains. Если выражение для искомого элемента имело побочные эффекты — поведение изменится. Этот баг попал в трекер и был исправлен в 1.26.3.

Как работать безопасно

Сначала смотрите diff без применения:
go fix -diff ./...


Запускайте из чистого git-состояния, в отдельной ветке.

Если сломалось — изолируйте анализатор:
go fix -slicescontains=false ./...
go fix -minmax ./...


Не забывайте про платформы: один запуск обрабатывает только текущую конфигурацию сборки. Для мультиплатформенных проектов запускайте с разными GOOS/GOARCH.

go fix — мощный инструмент, но не автопилот.

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика

#GoDeep
  • ❤ 6
  • 👍 4
  • 🔥 2
Post #7222 3.04K
🧐 sync.Pool в Go: 5 случаев, когда он вредит

Про sync.Pool обычно пишут в контексте оптимизации. Меньше аллокаций, ниже давление на GC, быстрее обработка. Звучит как бесплатный буст, поэтому разработчики начинают пулить всё подряд. А потом бенчмарки показывают, что стало хуже. Разберём конкретные ситуации, когда sync.Pool не помогает или ломает то, что работало.

Маленькие объекты

Пулить структуру из трёх int — хуже, чем просто создать новую. У пула есть собственные накладные расходы: упаковка в any (interface boxing), type assertion при каждом Get, атомарные операции на P-локальном кеше. Для маленьких объектов эти расходы перевешивают стоимость обычного new. Вы добавляете сложность в код и получаете отрицательный результат.

Простой способ проверить — бенчмарк с -benchmem. Если B/op и allocs/op не упали заметно, а ns/op вырос, пул обходится дороже, чем аллокация.

Объекты без сброса состояния

Это фабрика багов. Вы вызываете Get, получаете старый bytes.Buffer с данными предыдущего запроса, забываете вызвать Reset() и начинаете дописывать к чужим данным. В реальных системах это приводило к тому, что данные одного пользователя утекали в ответ другого.

Правильный паттерн — сбрасывать состояние сразу после Get:
buf := bufPool.Get().(*bytes.Buffer)
buf.Reset()
defer bufPool.Put(buf)


Можно сбрасывать и при Put. Главное — выбрать одну стратегию и не отступать от неё. Но сброс при Get надёжнее, потому что защищает от случаев, когда кто-то положил объект в пул без очистки.

Долгоживущие объекты

sync.Pool спроектирован для вещей, которые вы берёте, используете и возвращаете в рамках одной операции. Взяли буфер, записали ответ, вернули. Если объект живёт между запросами или хранит состояние на протяжении сессии, пул не нужен. Просто храните ссылку.

Ещё один нюанс: GC может очистить пул в любой момент. Объекты в sync.Pool не гарантированно доживают до следующего вызова Get. Если вы рассчитываете на то, что объект будет на месте, вы рассчитываете зря.

Буферы переменного размера

Допустим, вы пулите []byte. Большинство буферов занимают 1KB, но изредка некоторые вырастают до 10MB. После возврата в пул эти 10MB остаются закреплёнными в памяти до следующего цикла GC. Под нагрузкой таких раздутых буферов накапливается много, и потребление памяти растёт непредсказуемо.

Решение — ограничивать размер того, что возвращаете в пул:
defer func() {
if buf.Cap() < 64*1024 {
bufPool.Put(buf)
}
}()


Буферы крупнее порога просто отпускаются в GC. Если размеры сильно разнятся, можно завести отдельный sync.Pool для каждого класса размеров.

sync.Pool вместо кеша

sync.Pool — это не кеш. GC может стереть его содержимое в любой момент, и вы ничего с этим не сделаете. Нет ни TTL, ни лимита на размер, ни гарантии сохранности. Если вам нужно, чтобы объекты жили дольше одного цикла GC, используйте полноценный кеш.

Как понять, что пул вредит

Запустите бенчмарк с -benchmem и сравните версии с пулом и без:
BenchmarkHandler-8        500000   2400 ns/op   1024 B/op   3 allocs/op
BenchmarkHandlerPooled-8 800000 1500 ns/op 48 B/op 1 allocs/op


Такой результат означает, что пул работает. Но если ns/op вырос, а allocs/op почти не изменился, пул не оправдал себя. Убирайте его без сожалений.

В проде настоящий эффект пула виден через метрики GC: частоту запусков и длительность пауз (runtime.ReadMemStats, pprof). Если пул не снижает эти показатели, он занимает место в коде без пользы.

sync.Pool не стоит применять по умолчанию. Сначала профилируйте, найдите аллокации, которые реально влияют на производительность, и только потом пробуйте пул. Замерьте результат. Если улучшения нет, откатывайте. Большей части кода пул не нужен.

📍 Навигация: Вакансии • Задачи • Собесы • Канал в Max

🐸 Библиотека Go-разработчика

#GoDeep
  • ❤ 6
  • 👏 2
Post #7221 2.8K
⚡️ Знакомьтесь с экспертом Proglib Academy: AI-архитектор Антон Будняк

Антон — мастер превращения сырых AI-идей в отказоустойчивые системы. Он знает, как запустить MVP за неделю и масштабировать его так, чтобы архитектура не рассыпалась под нагрузкой в сотни тысяч юзеров.

За что его ценит IT-комьюнити:

🟣 Опыт в финтехе и крупном бизнесе
Руководил разработкой ML-моделей в финтехе с экономическим эффектом более 100 млн ₽


🟣 Запуск продуктов на 6.000+ пользователей
Антон строит сервисы, которыми пользуются тысячи людей в реальном проде.


🟣 Ускоряет разработку
Оптимизировал ML-пайплайны и кратно сократил время от начала разработки до релиза


📚 Где Антон черпает знания (рекомендации эксперта):

- X* — главный источник новостей. Рекомендую блог Бориса Черни (создателя Claude Code) — там база про использование ИИ в разработке.
- Нетворкинг в ТГ: чаты LLM под капотом и AI-чат — здесь можно найти ответ почти на любой технический вопрос.
- Новости AI: каналы Сиолошная и Denis Sexy IT.

На курсе Agentops Антон учит строить «неубиваемый» бэкенд: работать с очередями, таймаутами и балансировкой нагрузки, чтобы ваши агенты работали стабильно 24/7.

🎁 Майские СКИДКИ в Proglib Academy!

До конца мая на все курсы академии (включая AgentOps и разработку ИИ-агентов) действует скидка -40%. Это лучший момент, чтобы войти в AI-разработку под присмотром практиков.

Узнать больше о программе и обучении у Антона:
👉 Курс о том, как внедрять AI-логику в бэкенд и сохранять стабильность сервиса

Продолжаем знакомить вас с командой?
👍 — Да, ждем новых лиц
🔥 — Пойду подпишусь на каналы из списка Антона

🏃‍♀️ Proglib Academy

* - запрещен в рф
  • 👍 2
  • 👏 2
  • ❤ 1
  • 🥱 1
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →