Библиотека Go-разработчика | Golang – Telegram
Библиотека Go-разработчика | Golang
23.5K subscribers
2.35K photos
48 videos
87 files
4.76K links
Все самое полезное для Go-разработчика в одном канале.

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

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

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

РКН: https://gosuslugi.ru/snet/67a4a8c2468
Download Telegram
👨‍💻 Самоподписанный HTTPS для Go за пару минут

Репозиторий https-cert-go решает приземленную задачу получить сертификат для локальной разработки без плясок с OpenSSL и длинными командами.

Пример:
import https "github.com/romance-dev/https-cert-go"

pub, priv, _ := https.GenerateKeys(https.GenerateOptions{Host: "proglib.io"})


Самоподписанные сертификаты обычно используют для локальных UI сервисов и внутренних API которые не торчат в интернет.

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

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

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

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

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍11👾1
✏️ Делим без деления

Есть задача с собеседования: нужно поделить два целых числа без операций деления, умножения и остатка. При этом результат должен поместиться в 32 битный int. На практике это проверка на умение работать с битами и помнить про переполнения (или ещё одна причина вспомнить побитовые операции и забыть до следующего собеса).

Разложим как на доске:


• Есть dividend и divisor нужно вернуть целую часть деления с усечением к нулю. Делитель не равен нулю вычисления в диапазоне от минус два в тридцать первой до два в тридцать первой минус один.

• Можно в лоб вычитать divisor из dividend пока остаток не стал меньше делителя и считать шаги но это пролёт по времени и не работает на больших входах.

Главная идея — не вычитать делитель по одному разу, а вычитать сразу большие куски вида divisor умноженный на степень двойки. В двоичном мире умножение на степень двойки — это просто сдвиг влево, поэтому divisor << k не нарушает запрет на оператор умножения.

Алгоритм выглядит так:


1. Сначала обрабатываем спец случай, когда делимое равно минимальному int, а делитель равен минус один. В этом случае ответ теоретически равен 231231 и не помещается в int, поэтому по условию возвращаем максимальный int.

​2. Далее определяем знак результата через сравнение знаков делимого и делителя, сами значения приводим к модулю и переводим в int64, чтобы безопасно сдвигать и вычитать.

​3. Затем имитируем двоичное деление. Идём по битам от 31 до 0 и, если текущий делитель, сдвинутый на этот бит, все еще не больше остатка делимого, вычитаем его и прибавляем к ответу соответствующую степень двойки.

​4. В конце возвращаем результат с правильным знаком и проверяем, что он все еще внутри диапазона 32 битного int.

Код:
func divide(dividend int, divisor int) int {
const (
intMax = 1<<31 - 1
intMin = -1 << 31
)

// Спец случай переполнения
if dividend == intMin && divisor == -1 {
return intMax
}

// Определяем знак результата
neg := (dividend < 0) != (divisor < 0)

// Работаем с модулями в int64
a := int64(dividend)
b := int64(divisor)
if a < 0 {
a = -a
}
if b < 0 {
b = -b
}

var res int64

// Долгое деление в двоичном виде
for bit := 31; bit >= 0; bit-- {
if (b<<bit) <= a {
a -= b << bit
res += 1 << bit
}
}

if neg {
res = -res
}

if res > int64(intMax) {
return intMax
}
if res < int64(intMin) {
return intMin
}

return int(res)
}


По времени мы тратим O(log n), а по памяти константу, ведь всё делается на месте.

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

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

#ReadySetGo
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔12👍4🥱32
Конкурентность, которая не блокирует бюджет

В Go мы любим простоту и эффективность. Наша новогодняя акция работает так же: никаких сложных условий и скрытых аллокаций памяти.

Ты берешь 3 курса, а платишь за 1.

Оплата по самому дорогому курсу в наборе, два других — бесплатно.

Что усилит Go-разработчика:

— архитектуры и шаблоны проектирования (микросервисы сами себя не построят);
— алгоритмы и структуры данных.

Запустить горутину обучения

Таймаут контекста: 31 декабря.

Помощь с выбором: @manager_proglib
👾1
⚡️ Зачем в Go errors.Is и errors.As

До Go 1.13 ошибок касались двумя инструментами: сравнение err == someErr и type assertion через err.(MyErrorType). Это работало пока ошибки были плоскими значениями, но сломалось в тот момент, когда в язык завезли нормальное оборачивание ошибок с контекстом.

Проблема с err == someErr в том, что оно сравнивает конкретное значение, а не суть ошибки. Как только начали делать fmt.Errorf("connect db: %w", err) или свои обертки с Unwrap, верхний err уже не равен исходному значению, несмотря на то, что логически это та же ошибка.

Нужен был стандартный способ раскрыть цепочку оберток и проверить лежит ли внутри нужная ошибка. Именно это делает errors.Is — проходится по цепочке через Unwrap и сравнивает каждое звено, пока не найдет нужный err или не упрется в nil.

Аналогичная история с типами. До Go 1.13 приходилось делать каскады type assertion или ручным образом проходить по цепочке unwrap’ов чтобы найти конкретный тип ошибки. errors.As формализует этот паттерн — он проходит по цепочке ошибок и пытается привести каждую к нужному типу, а при успехе заполняет ваш target.

Простым языком errors.Is — это сравнение с константной ошибкой, а errors.As — это типовая проверка с учетом оберток.

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

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

#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍6
⚡️ Простой live reload не только для Go

Eletrize — это утилита для live reload, которая следит за файлами, пересобирает и перезапускает приложение при изменениях кода.

Идея возникла как замена Realize после того как команды автора столкнулись с проблемами установки и рандомными падениями этого тулза. В ответ он собрал Eletrize с упором на предсказуемый запуск, конфигурацию через отдельный файл и удобную интеграцию с VS Code launch конфигами.

Пример конфига:
schema:
- label: API
workdir: ""
envs:
key: "value"
env_file: ".env"
watcher:
path: "."
recursive: true
excluded_paths:
- "frontend"
extensions:
- ".go"
commands:
build:
method: "go"
args:
- "build"
envs:
key: "value"
env_file: ""
run:
- method: "./server"
envs:
PORT: "8080"
env_file: ""


Если не хочется тянуть тяжелые dev окружения вроде Docker compose для каждого pet проекта, Eletrize выглядит как вариант легкого live reload поверх стандартного go build && ./app, который можно использовать и с другими языками.

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

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

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

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
6👍3❤‍🔥2
🔎 Автоотклики, мок интервью и трекер откликов для IT специалистов

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

Библиотека программиста собрала 15 AI сервисов, которые закрывают весь цикл поиска работы за рубежом от портфолио и автоподачи откликов до имитации собеседований.

➡️ Список сервисов

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

🐸 Библиотека Go-разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁325👍2❤‍🔥1
💯 Топ-вакансий для Go-разработчиков за неделю

Junior Go-Developer — от 140 000 ₽. Скидывайте другу, который всё никак не может вкатиться.

Middle Backend Developer — от 4 000 €

Go Tech Lead — от 400 000 ₽. Отличная возможность выйти на следующую ступень.

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

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

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

#GoWork
Please open Telegram to view this post
VIEW IN TELEGRAM
🌟 Первый релиз-кандидат Go 1.26

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

В 1.26 заметный упор на производительность и рантайм к примеру, ускорили cgo вызовы и мелкие аллокации. Если у вас есть прод на Go, сейчас хороший момент добавить ещё один CI job на go1.26rc1 и посмотреть, как себя ведут сборка, тесты и перфоманс.

Попробовать:
go install golang.org/dl/go1.26rc1@latest
go1.26rc1 download


Команда отдельно напоминает про телеметрию можно включить её командой:
go telemetry on


➡️ Release notes

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

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

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🤔1
👎 Почему context.Value портит код

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

Но именно в этом и проблема context.Value превращается в чёрный ящик, ломает типобезопасность и делает важные зависимости невидимыми.

Паттерн «A положил payment в контекст, C его вытащил, а B просто прокинул ctx дальше» выглядит аккуратно, пока вы помните все неочевидные места чтения. Через неделю уже не видно, какие функции реально зависят от payment а это критические бизнес данные, спрятанные в контейнер без гарантий на уровне компилятора.

Любая ошибка в ключе, типе или месте, где забыли вызвать WithValue, всплывает только в рантайме, иногда в виде тихих багов, а не паники.

Как обычно делают с context.Value:
type Payment struct {
ID string
Amount int
}

func A(ctx context.Context, transactionID string) {
payment := dbGetPayment(ctx, transactionID)

// Кладём бизнес данные в контекст
ctx = context.WithValue(ctx, "payment", payment)

B(ctx)
}

func B(ctx context.Context) {
// Эта функция формально не знает про payment,
// но обязана протащить ctx дальше
doSomething(ctx)
C(ctx)
}

func C(ctx context.Context) {
// Где то глубоко в стеке достаем payment из «чёрного ящика»
payment, ok := ctx.Value("payment").(Payment)
if !ok {
log.Println("payment not found in context")
return
}

processPayment(payment)
}


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

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

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

#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍129🥱4💯2
This media is not supported in your browser
VIEW IN TELEGRAM
Go to Definition для Go-проектов без IDE

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

SourceCraft индексирует Go-код и предоставляет привычные инструменты IDE: переход к декларации и поиск использований. Точность навигации достигает высоких показателей, что позволяет полноценно разбираться в логике конкурентного кода и зависимостях прямо в окне просмотра пулл-реквеста.

Проверьте работу навигации по ссылке → https://sourcecraft.dev/code-navigation-demo/uikit/pr/2040
👍4🥱2
📎 Микрокомпилятор для микрокомпьютеров

TinyGo подвезли релиз 0.40.0 это финальное обновление 2025 года с упором на поддержку свежего LLVM, новое железо и зачистку багов.

Параллельно ускорили и облегчали встроенный сборщик мусора за счет урезания либы bdwgc и оптимизаций.

По железу появилась поддержка новых плат и микроконтроллеров в том числе ESP32 S3, Xiao ESP32S3, Gopher ARCADE и RP2350.

Внутри компилятора и рантайма прошлись по WASM и WASI добавили режим buildmode=wasi-legacy для старых сценариев, улучшили обработку финализаторов и экспорта функций, а также подчистили ошибки в интерпретаторе, cgo и обработке сообщений линкера.

➡️ Release notes

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

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

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥152👍2
💼 Карьерная «страховка» для IT‑шника

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

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

🐸 Библиотека Go-разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6