Библиотека 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
📚 ТОП-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": "[email protected]",
"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
🤔 Какие вебинары вам действительно нужны?

Привет, Go-разработчики! 👋

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

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

Заполнение займет всего пару минут, а нам это очень поможет! Спасибо, что участвуете в нашем развитии! 💙

👉
Пройти опрос
👍2
🎧 Новый выпуск подкаста о Go

В последнем эпизоде подкаста Cup o' Go ведущие обсуждают актуальные события в мире Go.

Основные темы выпуска:

Обновления безопасности: релизы Go 1.23.6, 1.22.12 и кандидат на релиз 1.24rc3, включающие важные исправления уязвимостей.

Предложение по автоматизации миграций: принятие предложения cmd/fix для автоматизации простых депрекаций.

Атаки на цепочки поставок: обсуждение недавней вредоносной активности, использующей кэширование Go Module Proxy для сохранения вредоносных пакетов.

🖇 Слушать обсуждение новостей

🐸Библиотека Go разработчика #подкаст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍2
Разбираем cron-like решения

Иногда в приложениях нужно выполнять задачи по расписанию: чистить кеши, отправлять отчёты или делать бэкапы. В Go есть несколько способов — от стандартных инструментов до сторонних библиотек.

Простой вариант — time.AfterFunc() или time.Ticker()

time.AfterFunc позволяет выполнить функцию однократно после заданной задержки:
time.AfterFunc(3*time.Second, func() {
fmt.Println("Executed after 3 seconds")
})


ticker
используется для периодического выполнения задач через определенные интервалы времени:
ticker := time.NewTicker(2 * time.Second)
defer ticker.Stop()

for i := 0; i < 3; i++ {
<-ticker.C
fmt.Println("Task executed at:", time.Now())
}



Сторонние библиотеки robfig/cron и gocron

robfig/cron поддерживает синтаксис crontab для планирования задач:
c := cron.New()

// Планируем задачу каждые 5 секунд
c.AddFunc("*/5 * * * * *", func() {
fmt.Println("Cron job executed at:", time.Now())
})

c.Start()


gocron предлагает простой API для повторяющихся задач:
s := gocron.NewScheduler(time.UTC)

s.Every(10).Seconds().Do(func() {
fmt.Println("Scheduled task executed at:", time.Now())
})

s.StartAsync()


Системный cron

Вместо того чтобы держать Go-процесс постоянно запущенным, можно использовать системный демон cron для выполнения Go-скриптов.
* * * * * /path/to/your-go-program


Если нужна простая задержка – хватит time.Ticker(). Если расписание сложнее – берём cron или gocron.

➡️ Разбор всех вариантов — в статье

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍234
Как применять сторителлинг на IT-собеседовании

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

➡️ Что внутри статьи:

▪️ Почему сторителлинг работает лучше сухого перечисления навыков.

▪️ Советы по созданию историй для IT-собеседований.

▪️ Готовые примеры успешных историй.

🔗 Читать статью

🔵 Чтобы подготовиться к IT-собеседованию, попробуйте наш курс «Алгоритмы и структуры данных»
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
⚙️ Управление памятью с weakPackage

Go 1.24 привнес нововведение — пакет weak, который позволяет использовать слабые указатели для оптимизации работы с памятью.

Что такое слабые указатели

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

Слабые указатели решают эту проблему: они не мешают сборке мусора — объект удаляется, если на него нет сильных ссылок.

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

package main

import (
"fmt"
"runtime/weak"
)

func main() {
obj := &struct{ Data string }{"Hello, Weak!"}

ref := weak.New(obj) // Создаем слабую ссылку

obj = nil // Убираем сильную ссылку

runtime.GC() // Принудительно запускаем GC

if ref.Get() == nil {
fmt.Println("Object was garbage collected!")
} else {
fmt.Println("Object is still alive:", ref.Get())
}
}

Важно: weak.Get() возвращает nil, если объект был удален сборщиком мусора.

Где это полезно

Пример кэширования с weak:
cache := make(map[string]*weak.Ref)

func getCachedData(key string) *Data {
if ref, found := cache[key]; found {
if data := ref.Get().(*Data); data != nil {
return data
}
}
newData := fetchDataFromDB(key)
cache[key] = weak.New(newData)
return newData
}

Если кэшированный объект перестанет использоваться, Go автоматически освободит память.

📎 Подробнее про слабые указатели

🐸Библиотека Go разработчика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22🤔53👍1👾1
🛠 Разработка CLI-приложения с миграциями и генерацией кода

Показываем ещё один пример приложения на Go. В нём можно попрактиковать:

• Настройку окружения: подключение PostgreSQL к Go.

• Работу с миграциями: управление схемами базы данных.

• Генерацию кода: ускоряем разработку и минимизируем ошибки.

• CLI-инструменты: автоматизация работы с БД.

Как это можно использовать


1️⃣ Менеджер задач. Создаешь CLI-приложение, где можно добавлять, удалять и редактировать задачи в БД.

2️⃣ Блог-платформа. Автоматически генерируешь код для работы с постами, комментариями и пользователями.

3️⃣ CRM-система. База клиентов, заказы, отчеты – все управляется через CLI.

🖇 В статье всё подробно разобрано с кодом и пояснениями.

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