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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4a8c2468
Download Telegram
🔄 Итераторы для пагинации API на Go: эффективная обработка данных

Работа с постраничными API — задача, знакомая каждому, кто пишет на Go. Но вместо того, чтобы тратить время на ручное управление запросами и ответами, можно использовать мощные инструменты стандартной библиотеки Go 1.23.

Итераторы — это способ автоматизировать пагинацию, делая код читаемым и гибким. С итератором вы сможете:

🚀 Обрабатывать данные без лишнего кода: забудьте о ручной обработке страниц, переключениях и урлах.
🔧 Упростить тестирование: используйте мок-объекты для проверки функциональности итератора без реального API.
🛠️ Повысить читаемость и масштабируемость кода: пишите лаконичные и удобные решения для сложных задач.

Если работа с REST API и пагинацией — часть ваших задач, итераторы могут стать тем инструментом, который вы давно искали. Время писать и тестировать код так, чтобы он работал за вас!
👍10🤔3🥱3😢2
🔢 iota в Go: магия автоматических констант

Что такое iota?
iota — это встроенный идентификатор в Go, используемый для генерации последовательных числовых значений внутри блока const. Он начинается с 0 и увеличивается на 1 в каждой новой строке.
go 
const (
A = iota // 0
B // 1
C // 2
)
fmt.Println(A, B, C)


💡Когда iota полезен?
1️⃣ Для последовательных значений:
iota автоматически увеличивается на 1, что идеально для создания счётчиков или статусов.

2️⃣ Для битовых флагов:
Используя iota, можно легко генерировать битовые флаги:
const (
Read = 1 << iota // 1
Write // 2
Execute // 4
)
fmt.Println(Read, Write, Execute)


3️⃣ Для вычислений:
iota можно использовать для создания сложных последовательностей. Например:
const (
KB = 1 << (10 * iota) // 1024
MB // 1048576
GB // 1073741824
)
fmt.Println(KB, MB, GB)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍34❤‍🔥8👾1
До Нового года мало времени, а до успеха в IT — всего один сертификат

Курсы от Proglib Academy — это крутой подарок для тех, кто интересуется IT, хочет освоить новую профессию и жить в шоколаде.

Почему сертификат на наши курсы — хороший презент:

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

Сертификат оформляется за пару минут, и даже не нужно ломать голову над упаковкой.

🚀 Подарите возможность начать год с полезных знаний и карьерного роста → подробнее о сертификатах
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6👍1
🔄 Timeouts в Go: Управление длительными задачами

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

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

🚀 Как реализовать таймауты в Go?
Go предлагает несколько удобных инструментов для работы с таймаутами. Вот несколько примеров:
1️⃣ Контексты с таймаутом
Контекст позволяет задавать ограничение по времени, которое автоматически завершит задачу при превышении лимита.
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

result := make(chan string)

go func() {
time.Sleep(3 * time.Second) // Долгая операция
result <- "Задача завершена"
}()

select {
case res := <-result:
fmt.Println("Результат:", res)
case <-ctx.Done():
fmt.Println("Таймаут:", ctx.Err())
}

Зачем использовать?
Это гибкий способ контролировать выполнение задач с возможностью передать контекст в функции.

2️⃣ Таймауты с time.After
Функция time.After позволяет просто установить ограничение времени для выполнения задачи.
done := make(chan string)

go func() {
time.Sleep(3 * time.Second) // Долгая операция
done <- "Успешно выполнено"
}()

select {
case res := <-done:
fmt.Println(res)
case <-time.After(2 * time.Second):
fmt.Println("Таймаут! Слишком долго")
}

Когда использовать?
Когда нужен быстрый и простой способ контролировать длительные операции.

3️⃣ HTTP-запросы с таймаутом
Для работы с сетевыми запросами Go предоставляет возможность задавать таймаут на уровне HTTP-клиента.
client := http.Client{
Timeout: 2 * time.Second,
}

_, err := client.Get("https://httpstat.us/200?sleep=3000")
if err != nil {
fmt.Println("Ошибка запроса:", err)
} else {
fmt.Println("Запрос выполнен успешно!")
}

Преимущество:
Контроль времени выполнения сетевых операций без дополнительных инструментов.

📌 Почему это важно?
Избежание зависаний: таймауты предотвращают блокировку программы.
Оптимизация ресурсов: долгие задачи прерываются, освобождая память и процессор.
Улучшение UX: пользователи быстрее получают обратную связь, даже если операция не удалась.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍162
🦑👨💻 Программист в «Игре в кальмара»: каковы твои шансы выжить?

Каждый день укрощаете горутины и собираете микросервисы? 🔧

Проверьте, помогут ли вам Go-скилы и железная логика выжить в «Игре в кальмара»! Один panic без recover может стать фатальным 💀🦑

🎯 Пройти тест
🥱82👍2🌚1
⭐️ Gowebly: современный инструмент для веб-разработки на Go

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

🚀 Что такое Gowebly?

Gowebly — это CLI для генерации веб-приложений на Go с использованием популярных фреймворков (Fiber, Gin, Echo и других) и интеграции с современными библиотеками для интерфейса, такими как htmx, hyperscript, Alpine.js и CSS-фреймворками (Tailwind CSS, Bootstrap и др.).

🔑 Ключевые возможности
Поддержка популярных Go-фреймворков
Генерация проектов с Fiber, Gin, Echo, Chi и другими фреймворками.

Современные интерфейсные технологии
Быстрая интеграция с htmx, Alpine.js и другими инструментами для создания динамических пользовательских интерфейсов.

CSS-фреймворки на выбор
Tailwind CSS, Bootstrap, UnoCSS — выбирайте то, что подходит вашему проекту.

Hot Reloading
Горячая перезагрузка шаблонов позволяет ускорить процесс разработки.

PWA-ready
Создавайте прогрессивные веб-приложения, готовые к установке на устройства.

Простота кроссплатформенной работы
Работает на Linux, macOS, Windows (включая WSL).
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍5😁3🥰1
Композиция в Go: как избежать скрытых проблем с интерфейсами

Композиция — одна из ключевых особенностей Go, позволяющая строить гибкие и переиспользуемые компоненты. Однако сочетание композиции с неявными интерфейсами может привести к неожиданным проблемам. В статье описывается реальная ситуация, где композиция поверх http.ResponseWriter нарушила работу Server-Sent Events (SSE).

Что произошло?
При добавлении кастомного функционала через композицию (встраивание) http.ResponseWriter, автор столкнулся с проблемой: неявные интерфейсы, такие как http.Flusher, перестали поддерживаться.
SSE, зависящие от возможности «сбрасывать» данные (Flush), перестали корректно работать.

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

Проблема с композицией:
Когда вы создаете собственную структуру, добавляя к ней http.ResponseWriter через композицию, интерфейс http.Flusher перестает быть реализованным:

type CustomWriter struct {
http.ResponseWriter
status int
}

func (cw *CustomWriter) WriteHeader(code int) {
cw.status = code
cw.ResponseWriter.WriteHeader(code)
}

Такой код работает для базовой обработки, но если клиент рассчитывает на интерфейс http.Flusher (например, для Server-Sent Events), он больше не доступен. SSE не будут работать корректно.

💡 Решение проблемы
Чтобы восстановить функциональность, автор явно реализовал недостающие методы в композируемой структуре. Например, был добавлен метод Flush в кастомный объект.

// Реализация метода Flush для поддержки интерфейса http.Flusher
func (cw *CustomWriter) Flush() {
if flusher, ok := cw.ResponseWriter.(http.Flusher); ok {
flusher.Flush()
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👾4👏2
🎨 Новый канал для вдохновения — UX in GIF

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

📌 Чем полезен канал?

→ Идеи для дизайна интерфейсов.
→ Анимации, которые можно повторить или адаптировать.
→ Лёгкий способ искать вдохновение перед новым проектом.

👉 Подписывайтесь и вдохновляйтесь: UX in GIF
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍3
🤖🎓 SmartClass: как научить AI проверять домашки программистов

Автоматизация рутинных задач — один из главных трендов в IT, но как насчет проверки домашек? Представьте себе систему, которая не только оценивает код студентов, но и помогает им понять свои ошибки, словно опытный наставник. Звучит как фантастика? В статье рассказывается, как проект SmartClass воплощает эту идею в реальность, используя возможности AI. Узнайте, какие технологии лежат в основе, с какими трудностями сталкиваются разработчики и как это меняет обучение программированию.

📎 Подробнее о том, как AI помогает проверять домашние задания
👾1
💡Как эффективно управлять уязвимостями в проектах на Go

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

Почему важно реагировать на уязвимости?
Никто не застрахован от появления уязвимостей в сторонних библиотеках или собственном коде. Даже если ваш проект работает стабильно, игнорирование уведомлений о безопасности может привести к катастрофическим последствиям. К примеру, недавно обнаруженные уязвимости в пакетах golang.org/x/net и golang.org/x/crypto стали ярким напоминанием о необходимости регулярного мониторинга безопасности.

🤨 Какие инструменты помогут?
Для выявления уязвимостей и управления зависимостями в Go существуют специализированные инструменты. Один из них — govulncheck, который позволяет анализировать зависимости проекта и находить известные уязвимости. Этот инструмент интегрируется с базой данных уязвимостей Go и предоставляет четкие рекомендации по их устранению.

Кроме того, если ваш проект включает Docker-образы, стоит обратить внимание на Docker Scout. Этот инструмент позволяет сканировать образы на наличие уязвимых компонентов и предоставляет подробные отчеты для их устранения.

🤨 Как начать?
Если вас заинтересовала тема управления уязвимостями в Go, обратите внимание на полезный гайд, в котором подробно описаны шаги по настройке govulncheck, работе с Docker Scout и обновлению зависимостей. Статья помогает не только понять, как реагировать на уведомления о безопасности, но и делает акцент на необходимости регулярного анализа кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
5👏1👾1
🤔 Go Generics: Работа с constraints.Comparable

Обобщения (generics) в Go стали одной из самых обсуждаемых функций языка. Давайте разберёмся, как использовать ограничение constraints.Comparable, чтобы создавать более гибкие и безопасные функции, работающие с любыми типами, поддерживающими сравнение.

Что такое constraints.Comparable?
constraints.Comparable — это ограничение (constraint) из библиотеки golang.org/x/exp/constraints. Оно позволяет работать только с типами, которые поддерживают операции сравнения (==, !=, <, >, <=, >=), такими как числа, строки или булевы значения.

Пример: поиск минимального значения
// Min находит минимальное значение в срезе
func Min[T constraints.Comparable](slice []T) (T, error) {
if len(slice) == 0 {
var zero T
return zero, fmt.Errorf("пустой срез")
}

min := slice[0]
for _, v := range slice[1:] {
if v < min {
min = v
}
}
return min, nil
}

Теперь её можно использовать с любыми типами, которые можно сравнить
func main() {
ints := []int{4, 2, 8, 1, 5}
minInt, _ := Min(ints)
fmt.Println("Минимум:", minInt)

strings := []string{"apple", "banana", "cherry"}
minString, _ := Min(strings)
fmt.Println("Минимум:", minString)
}


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

Ограничение constraints.Comparable: указывает, что тип T должен поддерживать операции сравнения.
Обобщённый параметр T: позволяет функции работать с любыми типами, удовлетворяющими ограничению.
Универсальность: функция Min может быть вызвана как с числами, так и со строками.

🤩 Хочется больше примеров? Читайте статью!
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍6🔥2
🗺 Привычка "срезать углы" при ходьбе – это интуитивное применение алгоритмов?

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

С нашим курсом «Алгоритмы и структуры данных» вы научитесь решать любые сложные задачи так же эффективно.

🎄Начните свой 2025 со скидкой 35% на все курсы. Это лучшее вложении уходящего года – https://proglib.io/w/014fe6d8
👍2
🍎 Визуализация вашего кода в один клик!

GitDiagram — это онлайн-инструмент, который позволяет визуализировать структуру и содержимое репозиториев GitHub в виде интерактивных диаграмм.

⚙️ Основные возможности:
Быстрая визуализация: превращает любой репозиторий GitHub в наглядную диаграмму, облегчая понимание структуры проекта;
Простота использования: достаточно заменить 'hub' на 'diagram' в URL любого репозитория GitHub, чтобы получить его визуализацию.

📎 Попробуйте сами! Введите URL интересующего вас репозитория для мгновенной визуализации!

#новость
❤‍🔥5👍5😢21🤔1
🏎️ 🎮 Golang на PSP: как язык программирования вышел за пределы серверов!

Что общего между языком Go и портативной консолью PlayStation Portable? На первый взгляд, ничего. Но один разработчик нашёл способ запускать программы на Go на этой культовой консоли! 🚀

💡 Как это возможно?
⚙️ WebAssembly и TinyGo: код на Go компилируется в WebAssembly (WASM) с помощью компилятора TinyGo.
⚙️ Инструменты: WASM преобразуется в C-код с помощью w2c2, а для графики используется библиотека raylib, портированная для PSP.

Зачем это нужно?
📌 Исследование возможностей Go в новых средах.
📌 Вдохновение для ретро-разработчиков и экспериментов с устаревшими устройствами.
📌 Простое хобби для фанатов PSP!

🛠️ Хотите попробовать? Прочитайте статью! Это отличный способ погрузиться в эксперименты с Go и WebAssembly.
🎉20👍71
🎯 Мини-статья о мьютексе в Go

В статье Линк Мэтью рассказывает, как управлять доступом к общим ресурсам в многопоточности с помощью мьютексов.

Мьютекс (mutual exclusion) гарантирует, что только одна горутина работает с разделяемым ресурсом в каждый момент времени.

В статье наглядно показано:
Что такое мьютекс и как он работает;
Простой пример использования sync.Mutex в Go.
👍121🥱1
🐌 Читаемость важнее скорости: зачем писать «медленный» код на Go?

Когда речь заходит о написании кода на Go, многие стремятся к максимальной производительности. Но действительно ли это всегда нужно? Джон Арундел из Bitfield Consulting утверждает обратное: в большинстве случаев читаемость кода важнее его скорости.

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

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

Как писать понятный код:
Используйте понятные имена переменных и функций.
Разбивайте сложные функции на простые и логически завершенные.
Документируйте свои решения и используйте комментарии там, где это оправдано.
Не бойтесь жертвовать "чуть-чуть большей производительностью" ради ясности.

#новость
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍83🤔1
💻📈 Итоги года Proglib: 2024 год в цифрах и достижениях

Чем вдохновляются разработчики, чтобы создавать новые проекты на Go? Proglib в этом году вновь стал местом, где инженеры обмениваются опытом, изучают тренды и находят полезные материалы.

Итоги года — это не только цифры, но и история роста сообщества, частью которого можете стать и вы!
4👍2
🌍✈️ 6 идей, как ускорить поиск работы за рубежом

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

👉 Читать статью
👍2🌚1
Как проверить, пуст ли интерфейс (interface{}) в Go?

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

1️⃣ Прямая проверка с == nil
Если интерфейс действительно пустой (значение и тип nil), проверка if myInterface == nil вернет true.
var i interface{}
if i == nil {
fmt.Println("Интерфейс пустой")
}


2️⃣ Проблема с nil и типом
Если интерфейс содержит nil с типом (например, *int), он не будет считаться пустым.
var i interface{} = (*int)(nil)
if i == nil {
fmt.Println("Пустой") // Не выполнится
} else {
fmt.Println("Не пустой") // Вывод: Не пустой
}


3️⃣ Проверка через reflect
Для точной проверки используйте пакет reflect:
import "reflect"

func isEmptyInterface(i interface{}) bool {
return i == nil || reflect.ValueOf(i).IsZero()
}


💡 Итог:
Используйте if i == nil для простых случаев.
Для значений nil с типом — добавьте проверку через reflect.
Не забывайте, что интерфейс с типом, но nil-значением, не считается пустым.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍213👏2
Бесплатный курс по фулстек-разработке — реальность 🔥

Под Новый год Дед Мороз приносит подарки, а наши подписчики — собственные курсы! Сергей Дмитриев, который занимается коммерческой разработкой уже 15 лет, поделился с нами своим обучением по созданию веб-сервиса с нуля. В курс входит 141 урок, 28 часов видео, исходный код и чат поддержки для участников.

Подробнее о курсе читайте на Хабре или в телеграм-канале Сергея
👍1