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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4a8c2468
Download Telegram
️ Если вы вдруг забыли: у нас можно купить рекламу

Библиотека программиста — медиа с миллионной аудиторией из IT-сферы. Что у нас есть:

• 60+ телеграм-каналов по разным IT-направлениям, от Python до DevOps

• 25 000 daily active users на сайте, который поможет усилить продвижение

• Возможность сделать нативную интеграцию, виральный пост и не только

За айтишной аудиторией — к нам 😏

По вопросам рекламы пишите сюда → @proglib_adv
🥱9👍1
👨‍💻 Создание сервиса сокращения URL на Go

Сервис сокращения URL — отличный способ улучшить навыки веб-разработки и работы с Go. В этом проекте используется база данных Redis и контейнеризация с помощью Docker.

Этапы разработки:

1️⃣ Инициализация проекта: создайте новый каталог для проекта и инициализируйте модуль Go с помощью команды go mod init.

2️⃣ Установка зависимостей: установите необходимые пакеты, такие как redis и mux для маршрутизации HTTP-запросов.

3️⃣ Определение моделей данных: создайте структуры для входящих и исходящих данных, например, ShortenRequest для исходного URL и ShortenResponse для сокращенного URL.

4️⃣ Настройка хранилища Redis: реализуйте функции для сохранения и извлечения URL-адресов из Redis.

5️⃣ Реализация обработчиков API: создайте обработчики для сокращения URL и перенаправления, обрабатывающие HTTP-запросы и взаимодействующие с хранилищем данных.

6️⃣ Настройка маршрутизатора: настройте маршруты для обработки запросов на сокращение URL и перенаправление, используя mux.

7️⃣ Docker'изация приложения: создайте Dockerfile и docker-compose.yml


🖇 Подробное описание каждого этапа в источнике.
Или можно посмотреть исходный код на GitHub

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱18👍12🤔2
☢️ Как не попасть в токсичную компанию: чек-лист для айтишника

C офферами от Сбера, Вконтакте, Яндекса и других айтишных гигантов все понятно — это стабильные компании, работать в которых мечтают многие.

Но вот что делать, если вас зовут работать в ноунейм-компанию, при этом предлагают з/п сильно выше рынка, полную удаленку и 100500 «плюшек»?

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

👉 Читать статью
😁3👍1
⚙️ Продвинутое логирование в Go

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

Zap предлагает несколько способов создания логгеров:

• zap.NewProduction(): выводит логи в формате JSON с минимальным уровнем Info.

• zap.NewDevelopment(): выводит логи в удобочитаемом формате с минимальным уровнем Debug.

• zap.NewExample(): имеет настройки, схожие с zap.NewDevelopment().

Уровни логирования в Zap:

• Debug: подробные сообщения для отладки.

• Info: информационные сообщения о нормальной работе приложения.

• Warn: предупреждения о проблемах, не требующие немедленного вмешательства.

• Error: сообщения об ошибках, которые требуют внимания, но не приводят к остановке приложения.

• DPanic: ошибки, которые вызывают панику в режиме разработки; в продакшене записываются как ошибки.

• Panic: запись сообщения и вызов паники, приводящей к остановке программы.

• Fatal: запись сообщения и завершение программы с кодом выхода 1.

Пример использования Zap:
package main

import (
"go.uber.org/zap"
)

func main() {
// Создание логгера с настройками для разработки
logger, _ := zap.NewDevelopment()
defer logger.Sync() // Очистка буферов перед завершением

// Запись различных уровней логов
logger.Debug("Это сообщение уровня DEBUG")
logger.Info("Это сообщение уровня INFO")
logger.Warn("Это сообщение уровня WARN")
logger.Error("Это сообщение уровня ERROR")
}


➡️ Подробнее про Zap

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱20👍162
📚 ТОП-11 книг по базам данных в 2025 году

Хотите разобраться в базах данных, но не знаете, с чего начать? Мы подготовили подборку из 11 лучших книг, которые помогут вам освоить раздичные базы данных, паттерны и антипаттерны, а также оптимизацию запросов.

🔗 Читайте в статье
👍8🥱4
🌐 Современный подход к работе с IP

Пакет net/netip – современное решение для работы с IP-адресами в Go. Он заменяет устаревший тип net.IP и предлагает компактные, неизменяемые и безопасные структуры для работы с IPv4 и IPv6

Основные типы и функции:

netip.Addr
Этот тип представляет IP-адрес и поддерживает как IPv4, так и IPv6. Методы типа позволяют проверить, к какому семейству адресов относится IP или определить его особенности, такие как принадлежность к loopback или multicast группам.

netip.Prefix
Используется для описания комбинации IP-адреса и сетевой маски.

ParseAddr и ParsePrefix
Пакет включает функции для преобразования строкового представления адресов и префиксов в объекты нужных типов.

📎 Документация по пакету

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🥱32
🧑‍💻 Shell-скрипты на Go

Библиотека script позволяет загружать и обрабатывать содержимое файлов, запускать внешние программы и анализировать их вывод, а также фильтровать текст – искать строки по шаблонам, заменять текст и сортировать данные.

С её помощью можно работать с HTTP-запросами, обрабатывать веб-страницы и структурированные данные.

✏️ Примеры:

Запуск команды и анализ вывода
count, err := script.Exec("ps aux").Match("nginx").CountLines()
if err != nil {
fmt.Println("Ошибка:", err)
return
}
fmt.Printf("Запущено %d процессов nginx\n", count)


Чтение файла и фильтрация строк
count, err := script.File("server.log").Match("ERROR").CountLines()
if err != nil {
fmt.Println("Ошибка:", err)
return
}
fmt.Printf("Найдено %d строк с ошибками\n", count)


Работа с HTTP-запросами
script.Get("https://golang.org").
Match("Go").
Stdout()


🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🤔41
🛠 Минимум аллокаций в Go

Zero-Allocation в Go — это мощный «инструмент», который помогает снизить нагрузку на GC и улучшить производительность

1️⃣ Используйте strings.Builder вместо «+» для строк

• Конкатенация + создает новую строку в куче.

• strings.Builder позволяет избежать лишних аллокаций.

2️⃣ Предварительно задавайте емкость срезов (make([]T, 0, cap))

• append() расширяет массив и выделяет новую память.

• Если емкость известна заранее, лучше использовать make.

3️⃣ Используйте copy() вместо append() для дубликатов срезов

• copy копирует данные без создания новых объектов.

4️⃣ Не передавайте указатели, если объект помещается в стек

• Переменные, переданные по указателю, могут уйти в кучу из-за escape-анализа.

5️⃣ Используйте sync.Pool для повторного использования объектов

Перед оптимизацией профилируйте код, чтобы понять, где реально нужны улучшения

➡️ Примеры для каждого приема в статье

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27😢10🥱5🔥3👾2
🛠 Проблема зависания Go-приложений в Steam

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

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

Всё указывает на то, что gameoverlayrenderer64.dll, отвечающая за наложение Steam Overlay, конфликтует с механизмом асинхронной предвыборки в Go.

Как исправить

Чтобы обойти этот баг, можно отключить асинхронную предвыборку при компиляции Go-приложения. Добавьте следующий флаг в команду сборки:
go build -ldflags="-X=runtime.godebugDefault=asyncpreemptoff=1"


Это позволит избежать зависания, но может повлиять на производительность приложения, так как отключается часть оптимизаций управления потоками.

Эта проблема уже обсуждается в сообществе Go-разработчиков, и можно ожидать её решения в будущих релизах.

➡️ Обсуждение проблемы в Steam и GitHub

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍4🥱2👾1
🧑‍💻 Гибкое тестирование в Go

Ginkgo это BDD-фреймворк (Behavior-Driven Development), который упрощает написание структурированных и читаемых тестов.

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

Особенно полезен Ginkgo для юнит-тестов, интеграционного тестирования и TDD-подхода. Он активно используется в Kubernetes, где тестирование играет ключевую роль.

Пример использования фреймворка:
func TestMain(t *testing.T) {
RunSpecs(t, "Main Suite")
}

var _ = Describe("Простая арифметика", func() {
Context("Операция сложения", func() {
It("должна правильно складывать числа", func() {
sum := 2 + 3
if sum != 5 {
Fail("Сумма 2 + 3 должна быть равна 5")
}
})
})
})


➡️ Документация проекта

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🥱13😢5
🔢 Проблемы с float в Go

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

Числа хранятся в двоичной системе, что приводит к ошибкам округления. Например, простое сложение может дать неточный результат:
fmt.Println(0.1 + 0.2) // 0.30000000000000004


Нельзя просто так взять и сравнить два числа с плавающей запятой. Проверка a == b может неожиданно вернуть false, если числа рассчитаны в разное время или через разные выражения.

➡️ Как избежать проблем

• Использовать пакет Decimal

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

• Сравнивать с учётом эпсилона

Когда сравниваете float-значения, лучше учитывать небольшую допустимую разницу:
const epsilon = 1e-9
if math.Abs(a-b) < epsilon {
fmt.Println("Числа равны")
}


• Переключаться на целые числа

Если возможно, стоит использовать int или хранить денежные значения в копейках (например, 100 рублей = 10000 копеек).

📎 Больше примеров в статье

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱14👍10🌚1
⚡️ Оптимизация запросов в Go с real-time batching

Real-time batching — это стратегия обработки входящих данных, при которой вместо выполнения каждой операции по одной они накапливаются в батч и обрабатываются вместе через небольшие интервалы времени.

Как это работает пошагово

1️⃣ Сбор событий в буфер — вместо того чтобы сразу обрабатывать каждое событие, мы добавляем его в очередь или в канал.

2️⃣ Таймер или лимит батча — если прошло, например, 50 мс, или набралось 100 событий, запускается обработка.

3️⃣ Групповая обработка — все собранные события обрабатываются одним запросом к базе данных, API или другому ресурсу.

Где применяется

• Базы данных – массовые INSERT и UPDATE, минимизирующие нагрузку

• Очереди сообщений – накопление сообщений перед отправкой

• Логирование – запись логов блоками вместо построчной записи

• Аналитика – сбор событий перед отправкой в мониторинговую систему

➡️ Подробности с примерами кода в статье

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍251👾1
🔥 База данных, выдерживающая триллионы запросов

Google Spanner — это уникальная распределённая SQL-база данных, сочетающая масштабируемость NoSQL и согласованность реляционных БД.

Как обрабатываются триллионы строк

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

Алгоритм Paxos. Позволяет реплицировать данные между датацентрами без потери согласованности.

TrueTime API. Google использует атомные и GPS-часы, чтобы обеспечить точную синхронизацию времени между серверами.

Где применяется

• Google Ads — миллиарды запросов в день

• Google Play — обработка глобальных транзакций

• YouTube — хранение и управление огромными объёмами данных

📎 Подробнее про Spanner

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🎉1
Swipe right or swipe left

Что делать, если твои мэтчи в жизни не такие точные, как твой код?

Спокойно, 14 февраля в 19:00 по МСК мы разберём, как ML анализирует speed dating и предсказывает match.

📌 Мы возьмем реальные данные со speed dating.

📌 Обучим модель, которая скажет: match или swipe left.

📌 Разберём, какие признаки реально важны (спойлер: работа в IT — не прям гарантия успеха (наши маркетологи подтверждают 😥).

💡 Приходи, если хочешь прокачать свой Python, ML и, возможно, станешь идеальной парой, как самый стильные форсы.

👉 Записаться
🤔6🌚2😁1
🛠 Декларативная валидация данных в Go

Zog – это библиотека, вдохновлённая Zod. Она позволяет гибко и декларативно проверять входные данные, минимизируя ручную обработку ошибок.

Где пригодится

• Валидация JSON-запросов в API

• Проверка параметров HTTP-запросов

• Чтение и проверка переменных окружения

• Минимизация кода валидации и ошибок

Пример использования:
var UserSchema = zog.Object(map[string]zog.Schema{
"username": zog.String().Min(3).Max(20),
"email": zog.String().Email(),
"age": zog.Number().Min(18),
})

func main() {
data := map[string]interface{}{
"username": "go_dev",
"email": "test@proglib.io",
"age": 25,
}

parsed, err := UserSchema.Parse(data)
if err != nil {
fmt.Println("Ошибка валидации:", err)
return
}

fmt.Println("Успешно:", parsed)
}

Создаём схему UserSchema, где username должен быть строкой длиной от 3 до 20 символов, email – валидным email-адресом, а age – числом не меньше 18. Передаём тестовый JSON и проверяем его с помощью UserSchema.Parse().

А как вы валидируете данные? Напишите в комментарии👇

🖇 Официальный репозиторий проекта

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍145🥱2
🔄 Минорное обновление Go

Недавно вышло свежее обновление Go версии 1.23.6. Сейчас разберём, что изменилось:

1️⃣ Безопасность: исправлены уязвимости в пакете crypto/elliptic.

2️⃣ Компилятор: устранены ошибки, повышающие стабильность и производительность.

3️⃣ Команда go: исправлены баги, улучшающие работу с инструментами командной строки.

Критичных нововведений нет, но обновиться стоит, особенно если у вас криптография в проекте.

➡️ Подробнее в GitHub milestones

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3
💬 Отправка push-уведомлений с помощью Go

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

🛠 Что понадобится:

1. Аккаунт Pushover, сервиса для отправки push-уведомлений.

2. API-ключ Pushover. Нужен для авторизации и отправки сообщений.

3. Файл с вашими целями. Обычный .txt с напоминаниями.

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

В файле хранятся ежедневные цели. Бот, написанный на Go, выбирает одну из целей — случайным образом или в заданном порядке — и отправляет её через Pushover в виде push-уведомления. Это происходит автоматически каждый день в установленное время.

💬 Интересная идея? Или в вашей жизни достаточно таск-трекеров? Ждём ваши мысли в комментариях👇

➡️ Посмотреть реализацию бота

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍101
This media is not supported in your browser
VIEW IN TELEGRAM
📱 GitHub в стиле TikTok

GitTok — это новый способ исследовать репозитории GitHub.

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

➡️ Попробовать полистать репозитории

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
😁36👾4🌚3👍1🥱1
🤖 AI угадывает, что на картинке

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

Интеграция с Gemini Pro Vision позволяет разработчикам без сложных настроек использовать компьютерное зрение в своих приложениях.

🛠 Реализация: изображение кодируется в base64, отправляется в API Gemini Pro Vision, а затем AI анализирует пиксели и пытается угадать, что на картинке.

Прежде чем приступать к изучению кода — попробуйте демо 👈

📎 Подробнее о реализации

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4👾2😁1