Библиотека Go для собеса | вопросы с собеседований
6.84K subscribers
219 photos
5 videos
1 file
404 links
Вопросы с собеседований по Go и ответы на них.

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

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

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

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
Что такое пакет syscall в Go и для чего он используется

Пакет syscall предоставляет низкоуровневые интерфейсы для работы с операционной системой, такими как вызовы системных функций (например, работа с файлами, процессы, сигналы и пр.).

Он позволяет взаимодействовать с операционной системой напрямую без использования специальных библиотек.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
В чем основное отличие между пакетами os и syscall в контексте работы с файлами

Пакет syscall предоставляет низкоуровневый доступ к системным вызовам операционной системы, напрямую взаимодействуя с файловыми дескрипторами и системными функциями.

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥3
Что такое паттерн Mediator

Паттерн Медиатор — это способ организовать общение между разными частями программы через одного «посредника».

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

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍151🔥1
Как обработать сразу несколько ошибок

Помимо поочерёдной обработки ошибок с Go 1.20 можно объединить ошибки в одну. Это позволяет создать агрегированную ошибку с несколькими вложенными ошибками.

Пример:
err = errors.Join(function1(), function2())

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🥱31🔥1
🫣 Устали от HR-сказок про «дружный коллектив» и «печеньки в офисе»?

Давайте честно поговорим о том, что действительно происходит на IT-рынке. Не в розовых презентациях, а в реальной жизни разработчиков, тестировщиков, аналитиков и всех, кто живет кодом.

🧐 Мы проводим исследование, чтобы выяснить:

— Как часто мы прыгаем между компаниями (и почему)
— Какие красные флаги заставляют бежать без оглядки
— Где реально находят работу
— Что бесит в HR больше всего
— Сколько кругов собеседований — это уже перебор

Результаты покажут реальную картину рынка. Без приукрашиваний. Может, компании поймут, что нужно менять, а специалисты — куда двигаться дальше.

😈 Опрос займет 5 минут, но результаты будут работать на всех нас → https://clc.to/9aaXVg
Сколько виртуальной памяти может использовать Go-процесс

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

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

Для того чтобы увидеть фактически использованную память процессом Go, можно воспользоваться командой top в Unix-системах. В столбцах RES (Linux) или RSIZE (macOS) можно увидеть количество реально выделенной памяти процессу Go.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍102🔥2
Какие типы указателей есть в Go

1. Указатель на тип (*T).

Это самый общий тип указателя. Он указывает на значение определенного типа. Например, *int указывает на значение типа int, а *string — на строку.

2. Указатель на массив.

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

3. Указатель на срез.

Срезы в Go являются динамическими и указывают на массив, поэтому можно работать с ними через указатели.
Указатель может быть nil, что означает отсутствие ссылки на значение.

4.
Указатель на структуру.

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

5. Указатели на интерфейсы.

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

6. Нулевой указатель:

Указатели могут быть nil. Это полезно для инициализации указателей, когда они ещё не указывают на какую-либо память.

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

Работа с указателями в Go безопасна благодаря сборщику мусора, который управляет памятью.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥21
🥴 Средний разработчик меняет работу каждые 1,5 года

И это не потому, что мы такие непостоянные. Просто рынок показывает свое истинное лицо быстрее, чем успевают напечатать визитки.

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

😳 О чем говорим откровенно:
— Job-hopping и что за этим стоит
— Red flags, которые мгновенно убивают мотивацию
— Реальные источники вакансий (не те, что рекламируют)
— Боль от общения с рекрутерами
— Сколько этапов отбора — норма, а сколько — издевательство

Когда мы объединим опыт сотен IT-специалистов, получится настоящая карта того, как устроена индустрия. Не по версии HR-отделов, а по версии тех, кто пишет код, тестирует продукты и двигает технологии вперед.

🚀 Участвовать в исследовании → https://clc.to/9aaXVg
1
Чем отличается TCP от UDP

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

UDP — это ненадежный протокол без установления соединения. Он быстрее, так как не проверяет доставку и не повторяет потерянные пакеты.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Где UDP будет предпочтительнее, чем TCP

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

Видеоконференции и стриминг — где задержка важнее, чем потеря отдельных пакетов.

Онлайн-игры — где важно быстрое обновление состояния игры, а потеря пакетов не всегда влияет на игровой процесс.

VoIP (голосовые вызовы по интернету) — где важно минимизировать задержку в передаче голоса, даже если часть данных потеряется.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Вакансии «Библиотеки программиста»

Привет! Мы ищем контент-менеджеров, которые будут вести наши телеграм-каналы о разработке.

👾 Требования:
— знать принципы залетающего контента
— разбираться в темах, связанных с разработкой

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

Условия:
— удаленка
— частичная занятость
— сдельная оплата в зависимости от количества задач

🔥 Оставляйте отклик, и мы свяжемся с вами: https://forms.gle/o4BZnsQ526JoqsCq9
❗️ Фидбек по прошедшей неделе

Оцените их по шкале 🔥,❤️,👍,😢, 🥱,
где 🔥 — это супер, а 🥱 — это скучно.

Также приветствуются комментарии под постом.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🥱157🔥7
Что возвращает метод bytes.SplitN и чем он отличается от bytes.Split

Метод bytes.SplitN возвращает срез подмассивов (срезов байт), которые являются результатом разделения исходного среза байт на части, используя заданный разделитель. Главное отличие от bytes.Split заключается в том, что SplitN ограничивает количество частей, которые будут возвращены. Второй параметр n указывает максимальное количество частей, а если значение n равно 1, метод просто возвращает исходный срез без изменений. Если n больше, чем фактическое количество частей, то метод SplitN вернет все возможные части.

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
😡 А вас тоже бесят облачные сервисы?

Согласитесь, статус отношений с облаками — все сложно. Но что, если можно изменить правила игры?

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

Что мы хотим узнать:
— Для чего вы реально используете облако?
— Чего катастрофически не хватает прямо сейчас?
— Что бесит больше всего? (можно материться)
— Как выбираете провайдера — по цене или по любви?
— и тому подобное

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

⚡️Время на опрос: меньше, чем на кофе-брейк. Жмите → https://clc.to/nboYDA
Какие инструменты для фаззинг-тестирования поддерживает Go

Go предоставляет встроенную поддержку фаззинг-тестирования с версии Go 1.18. Для этого в Go используется пакет testing, который теперь включает в себя поддержку фаззинга через встроенную функцию Fuzz

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Зачем может понадобиться паттерн функциональных опций

Функциональные опции позволяют гибко конфигурировать объект, не перегружая конструктор множеством параметров. Вместо длинной сигнатуры New() с десятком аргументов — часть параметров выносится в функции-опции.

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

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
❗️ Пример для предыдущего вопроса

У нас есть структура ServerConfig. Она хранит все настройки сервера: хост, порт, флаг использования TLS и таймаут.

В функции NewServer мы принимаем срез функций типа Option, который позволяет нам гибко настраивать сервер.

Каждая опция — это просто функция. Причём она не меняет сервер напрямую, а принимает на вход его конфигурацию и меняет только нужное поле.

import "fmt"

// Конфигурация структуры
type ServerConfig struct {
Host string
Port int
UseTLS bool
Timeout int
}

// Тип функции, которая изменяет настройки конфигурации
type Option func(*ServerConfig)

// Новый сервер с конфигурацией по умолчанию
func NewServer(options ...Option) *ServerConfig {
// Настройки по умолчанию
config := &ServerConfig{
Host: "localhost",
Port: 8080,
UseTLS: false,
Timeout: 30,
}

// Применение всех переданных опций
for _, option := range options {
option(config)
}

return config
}

// Опция для изменения хоста
func WithHost(host string) Option {
return func(c *ServerConfig) {
c.Host = host
}
}

// Опция для изменения порта
func WithPort(port int) Option {
return func(c *ServerConfig) {
c.Port = port
}
}

// Опция для включения TLS
func WithTLS(enable bool) Option {
return func(c *ServerConfig) {
c.UseTLS = enable
}
}

// Опция для изменения таймаута
func WithTimeout(timeout int) Option {
return func(c *ServerConfig) {
c.Timeout = timeout
}
}

func main() {
// Создаем сервер с настройками по умолчанию
server := NewServer()

// Печатаем настройки сервера
fmt.Printf("Default server config: %+v\n", server)

// Создаем сервер с измененными настройками
customServer := NewServer(
WithHost("example.com"),
WithPort(9090),
WithTLS(true),
WithTimeout(60),
)

// Печатаем новые настройки сервера
fmt.Printf("Custom server config: %+v\n", customServer)
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥43😁1
Зачем нужен метод bytes.Trim в Go

Метод bytes.Trim в Go удаляет все начальные и конечные байты, которые входят в заданный набор символов, называемый cutset. Он работает с срезами байтов и возвращает новый срез, в котором удалены все символы из cutset с начала и конца исходного среза. Этот метод не изменяет сам исходный срез.

Если в cutset указано несколько символов, метод удалит все символы, входящие в этот набор, с границ строки.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
2
😱 Завтра цена на курс «AI-агенты для DS» вырастет

Пока вы думаете — другие уже покупают. Что вы теряете, откладывая решение? Как минимум — 10 000 рублей, именно столько вы переплатите завтра. Как максимум — шанс войти в топ-1% дата-сайентистов, которые умеют строить AI-агенты.

🎓 Чему вы научитесь на курсе:
— адаптировать LLM под разные предметные области и данные
— собирать свою RAG-систему: от ретривера и реранкера до генератора и оценки качества
— строить AI-агентов с нуля — на основе сценариев, функций и взаимодействия с внешней средой

Решение за вами.

👉 Купить курс по старой цене
😁1
Можно ли использовать константы в switch

Да,в Go используют константы в выражениях switch. Это возможно, потому что константы имеют фиксированные значения, известные на этапе компиляции. Поскольку switch в Go работает с конкретными значениями, константы могут быть использованы в case выражениях без проблем, улучшая читаемость и предсказуемость кода.

🐸 Библиотека Go для собеса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🥱2