Библиотека Go-разработчика | Golang
24K subscribers
2.64K photos
48 videos
88 files
5.2K links
Все самое полезное для Go-разработчика в одном канале.

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

Учиться у нас: https://proglib.io/w/32d20779

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

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

#WXSSA
Download Telegram
😎 Топ-вакансий для Go-разработчиков за неделю

Golang-разработчик — от 220 000 до 250 000 ₽, удаленно по Москве

Go-разработчик — офис/гибрид в Москве

Software Golang Engineer — удалённо in english.

➡️ Еще больше топовых вакансий — в нашем канале Go jobs

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

#GoWork
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👏2
⚡️ Знакомьтесь с экспертом 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

* - запрещен в рф
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👏21🥱1
🧐 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
Please open Telegram to view this post
VIEW IN TELEGRAM
5👏2
👨‍💻 Что делать, если 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
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍4🔥2
📎 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
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7
👀 Практический курс «Разработка AI-агентов для автоматизации задач, работы и собственных проектов» со скидкой 40% до конца мая!

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

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

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

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

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

👉 Занимайте место на главном агентском интенсиве по лучшей цене
1🔥1
👨‍💻 В компилятор Go предложили добавить автовекторизацию

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

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

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

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

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

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

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥2
✏️ Пометить хелпер правильно

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


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

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

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

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

#ReadySetGo
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥Автодокументация 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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🥱1
🦾🧠🏋️ Качаем мозги к лету!

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

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

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

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

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

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

Почему мы?

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

Оставляйте заявку и бронируйте место со СКИДКОЙ 40%
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Типичный стек микросервисов

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

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

➡️ 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

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

#ликбез
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7🥱71
💸 Работать надо не 8 часов, а на валютной удалёнке

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

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

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

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

🐸 Библиотека Go-разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
😁73🥱3
🧑‍💻 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
Please open Telegram to view this post
VIEW IN TELEGRAM
2
⚡️ Последний шанс забрать курсы со СКИДКОЙ 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 ₽)
Интенсив для разработчиков, который поможет освоить основные паттерны проектирования и прокачать навыки архитектора программного обеспечения.

🌸 Выбирайте направление, оставляйте заявку на сайте распродажи, и наш менеджер подробно вас проконсультирует
Please open Telegram to view this post
VIEW IN TELEGRAM
3🥱3
🤩 Десктопные приложения на 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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍122👾1
✏️ 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
Please open Telegram to view this post
VIEW IN TELEGRAM
2