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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4a8c2468
Download Telegram
⚙️ GoCrypt 1.1.0: теперь быстрее

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

Новая версия 1.1.0 это переработала.

Раньше каждый вызов Encrypt() и Decrypt() переанализировал структуру с нуля. Если вы обрабатываете пользователя с 15 полями, где только 3–4 нужно шифровать, библиотека изучала все 15. В тысячный раз.

Теперь типы кешируются через sync.Map. Первый проход — сохраняются информация о том, какие поля нужны. Все последующие операции просто смотрят в кеш.

➡️ Репозиторий либы

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

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍201😁1
🔒 Когда fmt.Sprintf становится бомбой

SQL-инъекция — это не призрак из учебников по безопасности. Это реальная уязвимость, которая прячется в коде, написанном в спешке. И она может находиться в вашем приложении прямо сейчас.Её главная фишка в том, что она выглядит безобидно.

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

Когда вы склеиваете SQL-запрос из частей, вы решаете за базу данных, что считать кодом, а что — данными. И вы почти гарантированно ошибаетесь.

Хакер, в отличие от вас, знает это. Он понимает, что можно передать в поле username и заставить его работать как код. Он не пытается угадать пароль — он меняет саму структуру запроса.

Параметризованные запросы — это не украшение, а архитектура

Разница между уязвимым и безопасным кодом — это не регулярные выражения или специальные функции для очистки. Это просто разделение: запрос идёт одним пакетом, данные — другим.

// Сначала структура...
query := "SELECT id, username, email FROM users WHERE username = ?"
// ...потом данные
err := db.QueryRow(query, username).Scan(&id, &uname, &email)


Драйвер БД уже знает, что делать. Он не будет интерпретировать данные как команды.

Одной инъекции недостаточно, чтобы взломать приложение, если на входе стоит валидация.

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

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍202
🤨 Игнорирование контекста — это путь боли

Новичок пишет код примерно так:
res, err := http.Get(url)


Выглядит невинно, но если вызов зависнет, то зависнет и горутина. Навсегда. Нет таймаута, нет способа его отменить. Сервис просто накапливает горутины, пока не упадёт.

Профессионалы всегда передают контекст через все слои приложения:
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
res, err := http.DefaultClient.Do(req)


Они распространяют его на весь путь — от HTTP хендлера через бизнес-логику до репозиториев:
func (r *UserRepo) Get(ctx context.Context, id int) (*User, error) {
// ctx здесь и управляет отменой, и ловит таймауты
}


Это не просто хорошая практика — это основа надёжности.

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

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🤔51💯1
⚙️ Go-библиотека для интеграции OAuth

gologin предоставляет цепочки http.Handler-ов для аутентификации через Google, GitHub, Twitter, Bitbucket, Tumblr или любых других OAuth1 и OAuth2 провайдеров.

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

Быстрый старт

Интегрировать вход через GitHub занимает всего несколько строк:
import (
"github.com/dghubble/gologin/v2"
"github.com/dghubble/gologin/v2/github"
"golang.org/x/oauth2"
githubOAuth2 "golang.org/x/oauth2/github"
)

config := &oauth2.Config{
ClientID: "YourGithubClientID",
ClientSecret: "YourGithubClientSecret",
RedirectURL: "https://localhost:8080/callback",
Endpoint: githubOAuth2.Endpoint,
}

mux := http.NewServeMux()
mux.Handle("/login",
github.StateHandler(gologin.DefaultCookieConfig,
github.LoginHandler(config, nil)))
mux.Handle("/callback",
github.StateHandler(gologin.DefaultCookieConfig,
github.CallbackHandler(config, issueSession(), nil)))


Готово. Пользователь нажимает на /login, перенаправляется на GitHub, а затем на /callback с кодом авторизации.

Для веб-приложений используются LoginHandler и CallbackHandler, которые управляют редиректами.

Для мобильных приложений есть TokenHandler, который работает с токенами, передаваемыми напрямую. Twitter, например, включает специальный TokenHandler именно для таких случаев.

➡️ Репозиторий либы

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

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1551
🎁 И мозг прокачать, и макбук утащить!

Proglib.academy разыгрывает MacBook Pro 14 (M3 Pro, 36 GB, 1 TB SSD) 💻

Условия:

1️⃣ Покупаешь любой курс Proglib до 15 ноября.
2️⃣ Проходишь минимум 2 учебные недели (можно осилить за два вечера).
3️⃣ Пишешь куратору в чат своего курса: #розыгрыш.

Что за курсы?

Математика для Data Science (6 месяцев боли и просветления).
Основы Python, ML, алгоритмы, AI-агенты и даже курс для тех, кто в IT, но не кодит.

👉 Участвовать в розыгрыше
🥱32🤔1🤩1
💻 От логирования к передаче вверх

Go известен своей простотой, но именно в этой простоте скрыта мощная возможность — передача ошибок вверх по стеку вызовов. Часто начинающие разработчики просто логируют ошибку и возвращают nil, теряя всю информацию о контексте:
user, err := repo.GetUser(id)
if err != nil {
log.Println("failed to get user:", err)
return nil
}


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

Вот как это делают опытные разработчики:
user, err := repo.GetUser(ctx, id)
if err != nil {
return nil, fmt.Errorf("get user %d: %w", id, err)
}


%w — это ключ к вложенным ошибкам в Go 1.13 и новее. Такой подход сохраняет смысл ошибки и ее цепочку, что помогает в отладке и трассировке.

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

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🥱62
🤩 Finally — отсортированные часы

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

#GoGiggle
Please open Telegram to view this post
VIEW IN TELEGRAM
😁29👾3
📰 Дайджест недели

Вот и прошла трёхдневная рабочая неделя. Вспоминаем что произошло.

Ещё один ИИ из Китая

Свежий Cup o' Go

У Firefox новый маскот

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

GoCrypt 1.1.0

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

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
💻 ВАЖНО: макбук ещё не забрали!

Proglib.academy продолжает розыгрыш MacBook Pro 14» (M3 Pro, 36 Гб, 1 Тб SSD).

Что нужно для участия?

— Берёшь любой курс Академии до 15 ноября.
— Проходишь хотя бы 2 недели обучения (можно за два дня).
— Пишешь куратору #розыгрыш. Всё — ты в игре!

Что за курсы?

▫️Алгоритмы и структуры данных — если хочешь готовиться к собесам в Яндекс, FAANG и не сидеть на джуне вечно.

▫️Архитектуры и шаблоны проектирования — учат думать как senior, а не просто писать код.

▫️ Python, математика для DS, основы IT и другие темы — можно стартовать с нуля или усилить то, что уже знаешь.

👉 Влетай, не думай!
🥱9😁2👍1👾1
⚙️ Структура кода в Go: от папок к доменам

Многие начинающие Go-разработчики организуют проекты, разделяя файлы по типам — например, отдельные папки для моделей, обработчиков, утилит. Такая схема выглядит аккуратно:
/models
/utils
/handlers


Однако за этим скрываются проблемы: тесная связанность кода и круговые зависимости между пакетами.

Современный подход — разделять код по доменам и ответственности. Например, структура может выглядеть так:
/internal
/user
handler.go
service.go
repository.go
/pkg
/config
/logger
/cmd
/api
main.go


Это стандарт для крупных систем, таких как Uber или Cloudflare. Даже команда Go рекомендует именно такой подход.

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

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
30👍7🌚52😢2
💻 Хочешь MacBook Pro? Просто начни учиться!

Да-да, вы не ослышались: Proglib.academy дарит макбук за учёбу!

Всё просто:

— купи любой курс Академии до 15 ноября;
— пройди 2 недели обучения (можно за два дня);
— напиши куратору в чате курса хэштег #розыгрыш.

📚 Выбирай свой курс:

▫️ «Математика для DS» — для тех, кто хочет уверенно работать с данными;
▫️ «Основы Python» — чтобы начать писать код с нуля;
▫️ «Алгоритмы и структуры данных» — для будущих инженеров;
▫️ «AI-агенты» или «Машинное обучение» — для тех, кто хочет прокачаться в ИИ.

👉 Участвовать в розыгрыше
👍1😁1
💰 Топ-вакансий для Go-разработчиков за неделю

Go Developer — от 3 000 до 7 000 $

Middle GO разработчик на удалёнку

Джун Go разработчик — от 1 700 $

Golang-разработчик — от 200 000 ₽

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

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

#GoWork
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍2
🪙 Выложить монетки в лестницу

Дано n монет. Нужно выложить лестницу, где на i-й ступени ровно i монет. Вернуть количество полных рядов лестницы, которые удастся построить.

Наивный перебор даёт O(n), но попробуем быстрее:
func arrangeCoins(n int) int {
left, right := 0, n
for left <= right {
mid := left + (right-left)/2
sum := mid * (mid + 1) / 2
if sum == n {
return mid
}
if sum < n {
left = mid + 1
} else {
right = mid - 1
}
}
return right
}


Вместо перебора каждого уровня, бинарный поиск за O(log n) найдёт точный ответ.

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

#ReadySetGo
Please open Telegram to view this post
VIEW IN TELEGRAM
👍111
🛒 Black Friday от Proglib.academy!

Только до 30 ноября — скидка 40% на ВСЕ курсы.

Пора добавить в корзину не носки, а новые скиллы: Python, математика для Data Science, AI, алгоритмы и структуры данных, ML.

🎓 Выбирай курс, который реально двинет тебя в карьере, и учись со скидкой.

👉 Учиться со скидкой
👍1
⚙️ Быстрая настройка dev-окружения

Anvil — CLI для управления конфигурациями и установкой инструментов

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

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

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

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

#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
👨‍💻 Как управлять версиями Go-приложения

Представьте, что у вас есть приложение с тремя версиями: бесплатной, Pro и Enterprise. В бесплатной — базовый набор функций, в Pro — добавляем новую, а в Enterprise — ещё одну сверху.

В Go есть механизм build tags. Он позволяет управлять тем, какие файлы попадут в сборку.

Основной файл для Free версии может выглядеть так:
package main

import "fmt"

var features = []string{"A", "B"}

func main() {
for _, s := range features {
fmt.Println(s)
}
}


Два базовых функционала уже есть. Теперь создаём новый файл pro.go и добавляем туда функцию для Pro версии, но так, чтобы она включалась только при сборке с тегом pro:
//go:build pro
package main

func init() {
features = append(features, "C")
}


И для Enterprise версии можно сложить условия — пусть файл с функцией D будет собираться только если установлены оба тега pro и enterprise:
//go:build pro && enterprise
package main

func init() {
features = append(features, "D")
}


Собираем версии так:
go build -o free .
go build -o pro -tags=pro .
go build -o enterprise -tags=pro,enterprise .


Если раньше вы обходились константами или сложными if, попробуйте этот подход.

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

#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26101👏1🤔1
🔄 Обновление httpcache до версии 1.3.0

Httpcache — это библиотека для кеширования HTTP-ответов. Она работает как слой между клиентом и сервером, чтобы хранить копии ответов и выдавать их повторно при одинаковых запросах.

В свежем релизе httpcache 1.3.0 много новых возможностей:

1. Поддержка новых кеширующих вариантов:

• MongoDB с пулом
• Hazelcast для распределённого
• NATS JetStream KV для лёгкого кеширования
• PostgreSQL с бенчмарками
• FreeCache — высокопроизводительный кеш в памяти

2. Добавлена обёртка для кэшированных данных с поддержкой gzip, brotli и snappy

3. Добавлена поддержка AES-256-GCM шифрования (SecureCache) с динамическим размером nonce

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

➡️ Release notes

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

#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍4