Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
791 - Telegram Web
Telegram Web
Как работает errors.Is()

Функция errors.Is(err, target) позволяет проверять цепочку ошибок, включая обёрнутые ошибки.

errors.Is(err, ErrNotFound) сравнивает err с ErrNotFound по значению, поэтому сработает.

Почему err == ErrNotFound не сработает?

• err == ErrNotFound проверяет только точное совпадение указателей.

• Если ошибка была обёрнута (fmt.Errorf("%w", err)), указатель изменился, и == больше не сработает.

• А errors.Is() умеет разбирать цепочку ошибок, поэтому он правильно обработает вложенную ошибку.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем разница между rune и byte

byte и rune — это синонимы типов uint8 и int32:

• byte (аналог uint8) — хранит один байт. Используется для работы с ASCII-символами и []byte.
• rune (аналог int32) — хранит один Unicode-символ, так как некоторые символы занимают больше 1 байта.

Когда использовать

• byte — для ASCII-символов, массивов []byte, работы с файлами
• rune — для Unicode (например, китайские и эмодзи-символы)

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем отличие между буферизированным и небуферизированным каналом с точки зрения синхронизации

Небуферизированный канал: каждый отправитель блокируется, пока получатель не получит данные. Это означает, что операции отправки и получения жёстко синхронизированы.

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Чем sync.Cond отличается от sync.Mutex

sync.Mutex — примитив блокировки, предотвращает конкурентный доступ к данным. Горутины ждут освобождения мьютекса, но не получают уведомления об изменении состояния.

sync.Cond — механизм ожидания события. Горутины ждут условие (Wait()), а другая горутина будит (Signal() или Broadcast()) их, когда условие меняется.

sync.Cond полезен, когда нужно ждать события, а не опрашивать состояние в цикле.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Какую роль играет компилятор Go при проверке типов

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

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Когда использовать тип, а когда структуру

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

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

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

В нашем чате работает бот Shieldy — он защищает от спама, запрашивая у новых участников решение простой капчи.

⚠️ Проблема, с которой сталкиваются многие: вы нажимаете под постом «Прокомментировать», пишете что-то, а потом получаете бан и не можете писать комментарии.

Почему так: Shieldy отправляет капчу в сам чат, а не в комментарии под конкретный пост. Из-за этого капчу можно не увидеть, не отправить ответ на нее, и бот автоматически заблокирует вас.

Как присоединиться к чату, чтобы бот вас не забанил

— Зайдите в описание канала с телефона и нажмите кнопку Discuss / Чат
— Нажмите Join / Присоединиться
— Сразу обратите внимание на сообщение от бота Shieldy
— Решите простой пример и отправьте ответ в чат

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

❗️ Если вас все-таки забанили

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

Админы канала никак не могут ускорить процесс, бот автоматически снимает с вас блокировку через пару минут. Мы понимаем, что эта система неидеальна, и ищем более удобное решение.

👾 Спасибо, что активно участвуете в обсуждении наших постов!
Please open Telegram to view this post
VIEW IN TELEGRAM
Как изменить значение переменной через reflect?

Чтобы изменить значение переменной через reflect в Go, необходимо использовать метод Set(), предоставляемый типом reflect.Value. Однако для того чтобы использовать Set(), нужно убедиться, что передаваемый объект является изменяемым (т.е. является указателем на значение)

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Какие вопросы хотели бы увидеть на следующей неделе

👍🏼Классика: goroutine, channel, interface{} — то, что встречается на каждом собесе
🤔Неочевидные штуки: GC, race detector, pointer escaping — то, что вы не найдёте в туториалах
🔥Вопросы с кодом: разбор реальных кейсов или mini-challenges

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Как планировщик Go решает, на каком ядре будет выполняться конкретная горутина

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

Go использует модель планирования M:N (M горутин на N потоков). Это означает, что несколько горутин могут быть распределены по нескольким потокам ОС.

В Go есть три ключевых компонента, которые связаны с планированием горутин:

G (goroutine): горутина — поток, который управляется Go-рантаймом. В Go может быть создано много горутин (десятки тысяч и даже миллионы), и они используют системные ресурсы с минимальными затратами.

M (machine): системный поток, который Go использует для выполнения горутин. В операционной системе это обычный поток ОС. В Go обычно количество потоков M ограничено числом доступных ядер процессора.

P (processor): абстракция процессора, которая управляет очередями готовых горутин, которые могут быть исполнены. Каждый процессор может управлять множеством горутин, но горутина будет выполняться только на одном ядре в момент времени.

Go решает, на каком ядре будет выполняться горутина, на основе количества доступных процессоров (runtime.GOMAXPROCS) и текущей загрузки

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Какие стратегии можно использовать для уменьшения аллокаций памяти

• Использование пула объектов
При часто повторяющихся аллокациях можно использовать пул объектов (sync.Pool). Это позволяет повторно использовать объекты вместо того, чтобы создавать новые каждый раз.

• Предварительное выделение памяти
Если размер данных заранее известен, предварительное выделение памяти может помочь избежать ненужных динамических аллокаций. Например, при работе с большими срезами можно заранее выделить достаточный объём памяти, чтобы не выполнять расширение среза во время работы.

• Использование указателей вместо копий
Если возможно, следует использовать указатели
для передачи объектов, а не создавать их копии. Это позволяет избежать дополнительных аллокаций памяти при передаче данных между функциями.

• Использование буферов
Когда работаете с большими объемами данных, можно использовать буферизацию для чтения/записи.

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

Проблемы с потокобезопасностью
Если синглтон не был правильно реализован с учётом многозадачности, могут возникнуть гонки данных, когда несколько горутин одновременно пытаются создать или получить доступ к экземпляру синглтона.


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


Проблемы с производительностью
Синглтон может стать узким местом в многозадачных приложениях, особенно если доступ к нему синхронизирован с использованием блокировок, таких как мьютексы. Если горутины часто обращаются к синглтону и блокируют его, это может существенно снизить производительность программы.


Проблемы с инициализацией синглтона
Если синглтон требует сложной инициализации, например, создание нескольких объектов, настройка зависимостей, это может замедлить работу приложения, особенно если инициализация не оптимизирована.


🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Как под капотом работает sync.Once

Метод Do в структуре Once гарантирует, что функция, которую передали в метод, будет вызвана только один раз для каждого экземпляра Once. Если функция уже была вызвана, будущие вызовы Do не будут её повторно выполнять.

Быстрый путь:


В быстром пути (if o.done.Load() == 0) проверяет значение переменной done:

Если done равно 0 (т.е. действие ещё не выполнено), вызывается метод doSlow(f), который выполняет функцию с блокировкой.

Если done равно 1, значит действие уже выполнено, и метод просто завершает выполнение без вызова f.

Медленный путь:

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

Горутина захватывает мьютекс, чтобы синхронизировать доступ.

После захвата мьютекса снова проверяется значение done:
Если оно всё ещё равно 0, выполняется функция.
После выполнения функции устанавливается done в 1, чтобы указать, что функция была выполнена.
Мьютекс разблокируется, и другие горутины могут продолжить выполнение.


🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Зимний режим OFF. Весна начинается с апгрейда.

Если чувствуешь, что за зиму навыки подзастыли — пора их разморозить.

📦 Включили весеннюю распродажу: скидка –35% на курсы до конца марта.

Выбирай направление и выходи из спячки:

— Алгоритмы и структуры данных — чтобы собеседования в Яндекс, Ozon и другие были как уровень easy

— Математика для Data Science — для тех, кто не хочет просто «жать на кнопки», а понимать, что под капотом

— Архитектуры и шаблоны — если хочется мыслить как senior и прокачать системное мышление

— Python, Frontend, основы IT — для тех, кто стартует путь в разработке

👾 Proglib Academy — это как старая добрая 8-битная игра, но вместо врагов — практические задачи и собеседования.

Мы просто упаковали сложное обучение в пиксельную обёртку, чтобы тебе было чуть веселее прокачиваться.

🧠 Отогревай мозги, прокачивай скиллы и хватай свой power-up до конца марта.

👉 Выбрать курс
Как устроена защита от копирования в sync.once

Защита от копирования в sync.Once реализована с помощью специального поля noCopy. Это поле является пустой структурой, которое предотвращает копирование структуры sync.Once. В Go копирование структуры типа с таким полем не разрешается, и компилятор будет генерировать ошибку при попытке сделать копию этой структуры.

🐸Библиотека Go для собеса
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
Можно ли передать данные в body в GET запросе

Хотя HTTP позволяет добавить тело к GET-запросу, это не является стандартной практикой, и часто такие запросы могут не быть обработаны корректно на сервере или прокси. Для передачи данных в теле запроса рекомендуется использовать POST, PUT, PATCH

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Что будет при вызове runtime.Goexit в методе main

runtime.Goexit() завершает только текущую горутину, но если она вызывается в основной горутине, это приведет к deadlock.

Для завершения всей программы лучше использовать os.Exit(), чтобы избежать ошибок и корректно завершить выполнение.

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
Какая разница между select и обычным switch в Go?

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

🐸Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
2025/07/08 00:29:15
Back to Top
HTML Embed Code: