🦑👨💻 Программист в «Игре в кальмара»: каковы твои шансы выжить?
Каждый день укрощаете горутины и собираете микросервисы? 🔧
Проверьте, помогут ли вам Go-скилы и железная логика выжить в «Игре в кальмара»! Один panic без recover может стать фатальным 💀🦑
🎯 Пройти тест
Каждый день укрощаете горутины и собираете микросервисы? 🔧
Проверьте, помогут ли вам Go-скилы и железная логика выжить в «Игре в кальмара»! Один panic без recover может стать фатальным 💀🦑
🎯 Пройти тест
Разработка веб-приложений на Go становится ещё проще с Gowebly — инструментом командной строки, который сочетает мощь Go и современные веб-технологии. Если вы хотите быстро создавать быстрые и удобные веб-приложения, этот инструмент вам точно пригодится!
🚀 Что такое Gowebly?
Gowebly — это CLI для генерации веб-приложений на Go с использованием популярных фреймворков (Fiber, Gin, Echo и других) и интеграции с современными библиотеками для интерфейса, такими как htmx, hyperscript, Alpine.js и CSS-фреймворками (Tailwind CSS, Bootstrap и др.).
🔑 Ключевые возможности
Генерация проектов с Fiber, Gin, Echo, Chi и другими фреймворками.
Быстрая интеграция с htmx, Alpine.js и другими инструментами для создания динамических пользовательских интерфейсов.
Tailwind CSS, Bootstrap, UnoCSS — выбирайте то, что подходит вашему проекту.
Горячая перезагрузка шаблонов позволяет ускорить процесс разработки.
Создавайте прогрессивные веб-приложения, готовые к установке на устройства.
Работает на Linux, macOS, Windows (включая WSL).
Please open Telegram to view this post
VIEW IN TELEGRAM
Композиция в Go: как избежать скрытых проблем с интерфейсами
Композиция — одна из ключевых особенностей Go, позволяющая строить гибкие и переиспользуемые компоненты. Однако сочетание композиции с неявными интерфейсами может привести к неожиданным проблемам. В статье описывается реальная ситуация, где композиция поверх http.ResponseWriter нарушила работу Server-Sent Events (SSE).
Что произошло?
➖ При добавлении кастомного функционала через композицию (встраивание) http.ResponseWriter, автор столкнулся с проблемой: неявные интерфейсы, такие как http.Flusher, перестали поддерживаться.
SSE, зависящие от возможности «сбрасывать» данные (Flush), перестали корректно работать.
Go использует неявные интерфейсы, что обычно упрощает работу с кодом. Однако, при добавлении композиции, встроенный объект теряет автоматически реализуемые интерфейсы, если они явно не указаны в новой структуре.
❓ Проблема с композицией:
Когда вы создаете собственную структуру, добавляя к ней http.ResponseWriter через композицию, интерфейс http.Flusher перестает быть реализованным:
Такой код работает для базовой обработки, но если клиент рассчитывает на интерфейс http.Flusher (например, для Server-Sent Events), он больше не доступен. SSE не будут работать корректно.
💡 Решение проблемы
Чтобы восстановить функциональность, автор явно реализовал недостающие методы в композируемой структуре. Например, был добавлен метод Flush в кастомный объект.
Композиция — одна из ключевых особенностей Go, позволяющая строить гибкие и переиспользуемые компоненты. Однако сочетание композиции с неявными интерфейсами может привести к неожиданным проблемам. В статье описывается реальная ситуация, где композиция поверх http.ResponseWriter нарушила работу Server-Sent Events (SSE).
Что произошло?
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
Мы запустили свежий канал, где делимся идеями для дизайна интерфейсов. Всё самое стильное, оригинальное и вдохновляющее теперь в одном месте.
📌 Чем полезен канал?
→ Идеи для дизайна интерфейсов.
→ Анимации, которые можно повторить или адаптировать.
→ Лёгкий способ искать вдохновение перед новым проектом.
👉 Подписывайтесь и вдохновляйтесь: UX in GIF
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Библиотека девопса | DevOps, SRE, Sysadmin
🤖🎓 SmartClass: как научить AI проверять домашки программистов
Автоматизация рутинных задач — один из главных трендов в IT, но как насчет проверки домашек? Представьте себе систему, которая не только оценивает код студентов, но и помогает им понять свои ошибки, словно опытный наставник. Звучит как фантастика? В статье рассказывается, как проект SmartClass воплощает эту идею в реальность, используя возможности AI. Узнайте, какие технологии лежат в основе, с какими трудностями сталкиваются разработчики и как это меняет обучение программированию.
📎 Подробнее о том, как AI помогает проверять домашние задания
Автоматизация рутинных задач — один из главных трендов в IT, но как насчет проверки домашек? Представьте себе систему, которая не только оценивает код студентов, но и помогает им понять свои ошибки, словно опытный наставник. Звучит как фантастика? В статье рассказывается, как проект SmartClass воплощает эту идею в реальность, используя возможности AI. Узнайте, какие технологии лежат в основе, с какими трудностями сталкиваются разработчики и как это меняет обучение программированию.
📎 Подробнее о том, как AI помогает проверять домашние задания
В современном мире кибербезопасность играет ключевую роль в разработке программного обеспечения. Уязвимости в коде могут стать причиной серьезных проблем, включая утечку данных, финансовые потери и подрыв доверия пользователей.
Никто не застрахован от появления уязвимостей в сторонних библиотеках или собственном коде. Даже если ваш проект работает стабильно, игнорирование уведомлений о безопасности может привести к катастрофическим последствиям. К примеру, недавно обнаруженные уязвимости в пакетах 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
Обобщения (generics) в Go стали одной из самых обсуждаемых функций языка. Давайте разберёмся, как использовать ограничение 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)
}
Как это работает?
Please open Telegram to view this post
VIEW IN TELEGRAM
🗺 Привычка "срезать углы" при ходьбе – это интуитивное применение алгоритмов?
Так работает жадный алгоритм: вы выбираете наиболее выгодный шаг в каждый момент времени, чтобы минимизировать общий путь. То же самое применяют разработчики, создавая маршруты для такси или доставок.
С нашим курсом «Алгоритмы и структуры данных» вы научитесь решать любые сложные задачи так же эффективно.
🎄Начните свой 2025 со скидкой 35% на все курсы. Это лучшее вложении уходящего года – https://proglib.io/w/014fe6d8
Так работает жадный алгоритм: вы выбираете наиболее выгодный шаг в каждый момент времени, чтобы минимизировать общий путь. То же самое применяют разработчики, создавая маршруты для такси или доставок.
С нашим курсом «Алгоритмы и структуры данных» вы научитесь решать любые сложные задачи так же эффективно.
🎄Начните свой 2025 со скидкой 35% на все курсы. Это лучшее вложении уходящего года – https://proglib.io/w/014fe6d8
🍎 Визуализация вашего кода в один клик!
❓ GitDiagram — это онлайн-инструмент, который позволяет визуализировать структуру и содержимое репозиториев GitHub в виде интерактивных диаграмм.
⚙️ Основные возможности:
Быстрая визуализация: превращает любой репозиторий GitHub в наглядную диаграмму, облегчая понимание структуры проекта;
Простота использования: достаточно заменить 'hub' на 'diagram' в URL любого репозитория GitHub, чтобы получить его визуализацию.
📎 Попробуйте сами! Введите URL интересующего вас репозитория для мгновенной визуализации!
#новость
❓ GitDiagram — это онлайн-инструмент, который позволяет визуализировать структуру и содержимое репозиториев GitHub в виде интерактивных диаграмм.
⚙️ Основные возможности:
Быстрая визуализация: превращает любой репозиторий GitHub в наглядную диаграмму, облегчая понимание структуры проекта;
Простота использования: достаточно заменить 'hub' на 'diagram' в URL любого репозитория GitHub, чтобы получить его визуализацию.
📎 Попробуйте сами! Введите URL интересующего вас репозитория для мгновенной визуализации!
#новость
🏎️ 🎮 Golang на PSP: как язык программирования вышел за пределы серверов!
Что общего между языком Go и портативной консолью PlayStation Portable? На первый взгляд, ничего. Но один разработчик нашёл способ запускать программы на Go на этой культовой консоли! 🚀
💡 Как это возможно?
⚙️ WebAssembly и TinyGo: код на Go компилируется в WebAssembly (WASM) с помощью компилятора TinyGo.
⚙️ Инструменты: WASM преобразуется в C-код с помощью w2c2, а для графики используется библиотека raylib, портированная для PSP.
Зачем это нужно?
📌 Исследование возможностей Go в новых средах.
📌 Вдохновение для ретро-разработчиков и экспериментов с устаревшими устройствами.
📌 Простое хобби для фанатов PSP!
🛠️ Хотите попробовать? Прочитайте статью! Это отличный способ погрузиться в эксперименты с Go и WebAssembly.
Что общего между языком Go и портативной консолью PlayStation Portable? На первый взгляд, ничего. Но один разработчик нашёл способ запускать программы на Go на этой культовой консоли! 🚀
💡 Как это возможно?
⚙️ WebAssembly и TinyGo: код на Go компилируется в WebAssembly (WASM) с помощью компилятора TinyGo.
⚙️ Инструменты: WASM преобразуется в C-код с помощью w2c2, а для графики используется библиотека raylib, портированная для PSP.
Зачем это нужно?
📌 Исследование возможностей Go в новых средах.
📌 Вдохновение для ретро-разработчиков и экспериментов с устаревшими устройствами.
📌 Простое хобби для фанатов PSP!
🛠️ Хотите попробовать? Прочитайте статью! Это отличный способ погрузиться в эксперименты с Go и WebAssembly.
🎯 Мини-статья о мьютексе в Go
В статье Линк Мэтью рассказывает, как управлять доступом к общим ресурсам в многопоточности с помощью мьютексов.
Мьютекс (mutual exclusion) гарантирует, что только одна горутина работает с разделяемым ресурсом в каждый момент времени.
В статье наглядно показано:
✅ Что такое мьютекс и как он работает;
✅ Простой пример использования sync.Mutex в Go.
В статье Линк Мэтью рассказывает, как управлять доступом к общим ресурсам в многопоточности с помощью мьютексов.
Мьютекс (mutual exclusion) гарантирует, что только одна горутина работает с разделяемым ресурсом в каждый момент времени.
В статье наглядно показано:
✅ Что такое мьютекс и как он работает;
✅ Простой пример использования sync.Mutex в Go.
🐌 Читаемость важнее скорости: зачем писать «медленный» код на Go?
Когда речь заходит о написании кода на Go, многие стремятся к максимальной производительности. Но действительно ли это всегда нужно? Джон Арундел из Bitfield Consulting утверждает обратное: в большинстве случаев читаемость кода важнее его скорости.
❓ Почему не стоит зацикливаться на оптимизации:
➖ Go уже быстр: как компилируемый язык, Go обеспечивает высокую производительность даже без специальных оптимизаций.
➖ Код читается чаще, чем выполняется: поддерживаемость и простота кода экономят время команды в долгосрочной перспективе.
➖ Производительность редко критична: для большинства приложений скорость не является основным узким местом.
❓ Когда оптимизация важна?
Конечно, есть исключения — например, игры, высоконагруженные серверы или системное программное обеспечение, где каждый микросекундный прирост имеет значение. Но в остальных случаях следует отдавать предпочтение читаемости.
❓ Как писать понятный код:
➖ Используйте понятные имена переменных и функций.
➖ Разбивайте сложные функции на простые и логически завершенные.
➖ Документируйте свои решения и используйте комментарии там, где это оправдано.
➖ Не бойтесь жертвовать "чуть-чуть большей производительностью" ради ясности.
#новость
Когда речь заходит о написании кода на Go, многие стремятся к максимальной производительности. Но действительно ли это всегда нужно? Джон Арундел из Bitfield Consulting утверждает обратное: в большинстве случаев читаемость кода важнее его скорости.
Конечно, есть исключения — например, игры, высоконагруженные серверы или системное программное обеспечение, где каждый микросекундный прирост имеет значение. Но в остальных случаях следует отдавать предпочтение читаемости.
#новость
Please open Telegram to view this post
VIEW IN TELEGRAM
💻📈 Итоги года Proglib: 2024 год в цифрах и достижениях
Чем вдохновляются разработчики, чтобы создавать новые проекты на Go? Proglib в этом году вновь стал местом, где инженеры обмениваются опытом, изучают тренды и находят полезные материалы.
✅ Итоги года — это не только цифры, но и история роста сообщества, частью которого можете стать и вы!
Чем вдохновляются разработчики, чтобы создавать новые проекты на Go? Proglib в этом году вновь стал местом, где инженеры обмениваются опытом, изучают тренды и находят полезные материалы.
✅ Итоги года — это не только цифры, но и история роста сообщества, частью которого можете стать и вы!
🌍✈️ 6 идей, как ускорить поиск работы за рубежом
Статья для тех, кто устал от отказов и безрезультатных поисков. Узнайте секреты, которые помогут вам найти работу за рубежом в разы быстрее!
👉 Читать статью
Статья для тех, кто устал от отказов и безрезультатных поисков. Узнайте секреты, которые помогут вам найти работу за рубежом в разы быстрее!
👉 Читать статью
Как проверить, пуст ли интерфейс (interface{}) в Go?
В Go интерфейс считается пустым, только если оба его компонента (динамическое значение и тип) равны nil. Однако есть нюансы, о которых стоит знать.
1️⃣ Прямая проверка с == nil
Если интерфейс действительно пустой (значение и тип nil), проверка if myInterface == nil вернет true.
2️⃣ Проблема с nil и типом
Если интерфейс содержит nil с типом (например, *int), он не будет считаться пустым.
3️⃣ Проверка через reflect
Для точной проверки используйте пакет reflect:
💡 Итог:
➖ Используйте if i == nil для простых случаев.
➖ Для значений nil с типом — добавьте проверку через reflect.
➖ Не забывайте, что интерфейс с типом, но nil-значением, не считается пустым.
В Go интерфейс считается пустым, только если оба его компонента (динамическое значение и тип) равны nil. Однако есть нюансы, о которых стоит знать.
Если интерфейс действительно пустой (значение и тип nil), проверка if myInterface == nil вернет true.
var i interface{}
if i == nil {
fmt.Println("Интерфейс пустой")
}
Если интерфейс содержит nil с типом (например, *int), он не будет считаться пустым.
var i interface{} = (*int)(nil)
if i == nil {
fmt.Println("Пустой") // Не выполнится
} else {
fmt.Println("Не пустой") // Вывод: Не пустой
}
Для точной проверки используйте пакет reflect:
import "reflect"
func isEmptyInterface(i interface{}) bool {
return i == nil || reflect.ValueOf(i).IsZero()
}
Please open Telegram to view this post
VIEW IN TELEGRAM
Бесплатный курс по фулстек-разработке — реальность 🔥
Под Новый год Дед Мороз приносит подарки, а наши подписчики — собственные курсы! Сергей Дмитриев, который занимается коммерческой разработкой уже 15 лет, поделился с нами своим обучением по созданию веб-сервиса с нуля. В курс входит 141 урок, 28 часов видео, исходный код и чат поддержки для участников.
Подробнее о курсе читайте на Хабре или в телеграм-канале Сергея
Под Новый год Дед Мороз приносит подарки, а наши подписчики — собственные курсы! Сергей Дмитриев, который занимается коммерческой разработкой уже 15 лет, поделился с нами своим обучением по созданию веб-сервиса с нуля. В курс входит 141 урок, 28 часов видео, исходный код и чат поддержки для участников.
Подробнее о курсе читайте на Хабре или в телеграм-канале Сергея
С наступающим, Go сообщество! Или уже наступившим! 🎆 🎆
Уже придумали чем заняться в новом году?😉
Если нет, то предлагаем вам подборку фильмов и сериалов к просмотру:
🔠 Остановись и гори (2014)
🅰️ Игра в имитацию (2014)
🔠 Revolution OS (2001)
©️ Разрабы (2020)
🔠 Кто я (2014)
Уже придумали чем заняться в новом году?
Если нет, то предлагаем вам подборку фильмов и сериалов к просмотру:
Please open Telegram to view this post
VIEW IN TELEGRAM
Давайте признавайтесь в комментариях — что вам подарили? 👇
#интерактив
#интерактив
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM