Идентификатор канала: 72625731109378
🌍 Открытый канал
| Канал | Публикаций | Подписчиков | Последний пост |
|---|---|---|---|
|
|
1 | 655 | 04.04.2026 |
|
|
1 | 807 | 04.04.2026 |
|
|
1 | 1082 | 04.04.2026 |
|
|
1 | 1481 | 04.04.2026 |
|
|
1 | 1080 | 04.04.2026 |
|
|
1 | 1417 | 04.04.2026 |
|
|
1 | 1970 | 04.04.2026 |
Нет данных о рекламе
Загрузка данных...
| Размещенный пост | Текст публиакции | Рекламирующий канал | Просмотры | Просмотры 24 ч | Прирост подписчиков |
|---|
Загрузка данных...
| Размещенный пост | Текст публикации | Рекламируемый канал | Просмотры | Просмотры 24 ч | Прирост подписчиков |
|---|
| Дата и время публикации | Текст публикации | Рекламируемый канал | Динамика просмотров | Всего просмотров |
|---|---|---|---|---|
| 2026-04-04 10:25:42 | 🚧 Errors in Go: Хватит сравнивать ошибки через == Знакомая картина? Вы пишете запрос к базе, получаете ошибку, оборачиваете её для логов и возвращаете наверх: // Слой репозитория func GetUser() error { err := db.QueryRow(...) if err != nil { // Обернули, чтобы дать контекст return fmt.Errorf("getUser failed: %v", err) } } А на слое выше (в хендлере) кто-то пытается проверить, не была ли это ошибка "пользователь не найден": // Слой хендлера err := GetUser() // 🤡 Ошибка! Это условие НИКОГДА не выполнится if err == sql.ErrNoRows { return 404 } Почему не выполнится? Потому что fmt.Errorf с глаголом %v создал новую строку. Оригинальная ошибка sql.ErrNoRows стерлась. Чтобы это починить, джуны начинают парсить текст ошибки через strings.Contains() - и это прямой путь в ад. С версии Go 1.13 язык предлагает элегантное решение - распаковку "матрешки" ошибок. 1. Упаковываем: глагол %w Чтобы добавить контекст, но сохранить оригинальную ошибку внутри, используйте %w (wrap): return fmt.Errorf("getUser failed: %w", err)Теперь ваша ошибка это матрешка. Снаружи текст "getUser failed", а внутри лежит sql.ErrNoRows. 2. Распаковываем значения: errors.Is Забудьте про оператор == при работе с ошибками, если есть хотя бы малейший шанс, что ошибка обернута. Используйте errors.Is. Эта функция рекурсивно заглядывает внутрь каждой матрешки и ищет совпадение: if errors.Is(err, sql.ErrNoRows) { // Выполнится успешно, даже если ошибка была обернута 10 раз! return 404 } 3. Распаковываем типы: errors.As errors.Is нужен для проверки конкретных переменных-синглтонов (sentinel errors). Но что если вы используете кастомные структуры ошибок с дополнительными полями (например, HTTP статус-код)? Встречайте errors.As. Это безопасный способ достать конкретный тип из цепочки ошибок: type MyDomainError struct { Msg string Code int } func (e *MyDomainError) Error() string { return e.Msg } // ... где-то в коде проверяем: var domainErr *MyDomainError // Если в цепочке err есть тип *MyDomainError, // errors.As запишет его в переменную domainErr и вернет true if errors.As(err, &domainErr) { fmt.Println("HTTP Status:", domainErr.Code) } 🔥 Senior Tip: Не оборачивайте всё подряд Если вы оборачиваете ошибку через %w, она становится частью вашего публичного API. Если слой базы данных возвращает обернутую pgx.ErrNoRows, а слой HTTP-хендлера проверяет её через errors.Is, вы создали жесткую связность (coupling). Хендлер теперь знает про базу данных! • Используйте %w, когда хотите позволить вызывающему коду реагировать на причину. • Используйте %v (или создавайте новую чистую ошибку), когда хотите скрыть детали реализации нижнего уровня. #golang #errors #cleancode #bestpractices 👉 @golang_lib 🚧 Errors in Go: … |
|
|
49 |
| 2026-04-04 10:20:17 | Qrcp Передавайте файлы по Wi-Fi с компьютера на мобильное устройство, сканируя QR-код, не отходя от терминала. https://github.com/claudiodangelis/qrcp 👉 @golang_lib Qrcp Передавайт… |
|
|
26 |
| 2026-04-04 10:18:11 | Tetrigo Играйте в Тетрис на своём терминале. Реализация Тетриса на Golang, соответствующая официальному руководству по дизайну Тетриса 2009 года. https://github.com/Broderick-Westrope/tetrigo 👉 @golang_lib Tetrigo Играйте… |
|
|
26 |
| 2026-04-04 10:17:38 | Go sync.Mutex: Normal and Starvation Mode Go sync.WaitGroup and The Alignment Problem Go sync.Pool and the Mechanics Behind It (We’re here) Go sync.Cond, the Most Overlooked Sync Mechanism Go sync.Map: The Right Tool for the Right Job Go Sync.Once is Simple… Does It Really? Go Singleflight Melts in Your Code, Not in Your DB https://victoriametrics.com/blog/go-sync-mutex/index.html 👉 @golang_lib Go sync.Mutex: N… |
|
|
25 |
Загрузка данных...
| Время | Контент | Подписчиков | Кто ссылался | Просмотры | Просмотры 24 ч |
|---|