Библиотека Go для собеса | вопросы с собеседований
описание
Вопросы с собеседований по Go и ответы на них. Учиться у нас: clc.to/iEeaZw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197
7 482
подписчиков
Охват к подписчикам
14,8%
ERR
Реакции к просмотрам
0,21%
56 на 24 постов
Пересылки к просмотрам
0,39%
104
Постов в день
0,1
всего 23
Где отзываются чаще
доля реакций к просмотрам- 23 июл.❓ Что такое руны в Go Руна (тип rune) — это один символ Unicode. По сути это синоним типа int32: под капотом руна хранит числовой код символа (так называемый code point). Зачем это нужно: в Go строки хранятся в кодировке UTF-8, где один символ может занимать от 1 до 4 байт. Поэтому индексация строки по байтам (s[i]) вернёт именно байт, а не символ — и для не-ASCII текста это будут «половинки» символа. Руны решают эту проблему: когда вы перебираете строку через range или преобразуете её в []rune, Go корректно разбивает её на цельные символы, а не на байты. s := "Привет" fmt.Println(len(s)) // 12 — байты fmt.Println(len([]rune(s))) // 6 — символы for i, r := range s { fmt.Printf("%d: %c\n", i, r) // r имеет тип rune } 🐸 Библиотека Go для собеса0,68%
- 28 мая📌 Что такое микросервисы в айти Микросервисы — это подход, при котором ваше приложение превращается в созвездие маленьких, независимых сервисов. Каждый живет своей жизнью, решает одну конкретную задачу и общается с «соседями» через API. Где мы это видим на практике: Онлайн-магазины: один сервис отвечает только за корзину, другой за оплату, третий «пинает» доставку. Если упала оплата, корзина всё еще работает. Стриминги (Netflix/YouTube): каталог фильмов, система рекомендаций и сам плеер это разные микросервисы. Поэтому рекомендации могут «тупить», но фильм всё равно будет играть. А что сейчас в вашем проекте? ❤️ — Уютный монолит (всё в одном месте, полёт нормальный) 🔥 — Микросервисный зоопарк 🔹 Практический интенсив «Архитектуры и шаблоны проектирования» 🔹 Получить консультацию менеджера 🔹 Сайт Академии 🔹 Сайт Proglib 🏃♀️ Азбука айтишника #ликбез0,56%
- 25 июл.❓ В чём разница между //go:build и // +build Обе директивы — это build constraints (ограничения сборки), которые указывают компилятору, при каких условиях включать файл в сборку. Разница в синтаксисе и возрасте. // +build — старая форма, использовавшаяся до Go 1.17: • Размещается в начале файла, до объявления пакета. • После блока директив обязательна пустая строка. • Условия комбинируются неочевидно: пробел означает «И», запятая — «ИЛИ», а несколько строк — тоже «И». Это часто путало. //go:build — новая форма, введённая в Go 1.17: • Использует привычные логические выражения с &&, ||, ! и скобками. • Читается гораздо понятнее. // Старая форма: // +build linux,amd64 darwin // Новая форма: //go:build (linux && amd64) || darwin Начиная с Go 1.17, инструмент gofmt автоматически добавляет //go:build рядом со старыми // +build, синхронизируя их. Сегодня рекомендуется использовать именно //go:build, а старую форму оставляют лишь для совместимости со совсем древними версиями Go. 🐸 Библиотека Go для собеса0,56%
- 22 июл.❓ Как в Lock-Free алгоритмах борются с бесконечными повторными попытками Когда несколько потоков одновременно «крутят» CAS, часть из них может подолгу проваливать попытки и впустую жечь процессор. Чтобы этого избежать, применяют несколько приёмов: • Экспоненциальный бэкофф. Перед следующей попыткой CAS поток выжидает интервал, увеличивая его с каждой неудачей (обычно со случайным разбросом, чтобы потоки не синхронизировались). Это снижает конкуренцию и нагрузку на CPU. • Адаптивные алгоритмы. Поведение потоков подстраивается под метрики системы — уровень контеншена, загрузку процессора — и стратегия ожидания меняется на лету. • Ограничение по времени/попыткам (timed wait). Если CAS не удаётся за отведённое число попыток или время, поток прекращает спин и переходит на fallback-путь. • Гибридный подход (hybrid locking). В качестве резерва подключаются мьютексы или другие блокирующие примитивы, когда неблокирующий путь себя не оправдывает. Итог: цель всех этих механизмов — превратить «бесконечный спин» в контролируемое ожидание и не дать потокам молотить процессор вхолостую. 🐸 Библиотека Go для собеса0,54%
- 26 июл.❓ Что такое fallthrough в Go fallthrough — это ключевое слово внутри switch, которое передаёт управление следующему case, не проверяя его условие. В отличие от C и многих других языков, в Go switch по умолчанию не «проваливается» дальше: выполнение завершается сразу после первого совпавшего case, без явного break. fallthrough включает обратное поведение — принудительный переход к следующему блоку. switch n { case 1: fmt.Println("один") fallthrough case 2: fmt.Println("два") // выполнится, даже если n == 1 default: fmt.Println("другое") } Важные нюансы: • fallthrough передаёт управление безусловно — условие следующего case игнорируется. • Он должен стоять последним оператором в case, иначе будет ошибка компиляции. • Из последнего case (или default, если он в конце) провалиться некуда — там fallthrough использовать нельзя. 🐸 Библиотека Go для собеса0,32%
- 1 окт. 2024 г.💻🔍💼 Кризис IT-рынка: как джуны и кадровый голод меняют правила игры В условиях нехватки опытных специалистов и наплыва джунов, IT-компании вынуждены искать нестандартные подходы к найму. Рассмотрим основные тренды и стратегии адаптации рынка. Читать статью #почитать0,29%
- 31 июл.❓ Как создать свою кастомную ошибку в Go • Пакет errors — самый быстрый способ Подходит для простых статичных ошибок. Такую переменную удобно объявить один раз и сравнивать через errors.Is. var ErrNotFound = errors.New("запись не найдена") • fmt.Errorf() — когда нужен контекст Позволяет подставить в текст детали. А глагол %w ещё и «оборачивает» исходную ошибку, сохраняя цепочку для errors.Is / errors.Unwrap. return fmt.Errorf("не удалось загрузить юзера %d: %w", id, ErrNotFound) • Кастомный тип через struct — максимум гибкости Нужен, когда к ошибке хочется прикрепить данные (код, поле, статус). Достаточно реализовать метод Error() string — и тип становится ошибкой. type ValidationError struct { Field string Msg string } func (e *ValidationError) Error() string { return fmt.Sprintf("%s: %s", e.Field, e.Msg) } Такую ошибку потом можно вытащить через errors.As и прочитать её поля. 🐸 Библиотека Go для собеса0,28%
- 29 июл.❓ Что делает переменная окружения GOOS в Go GOOS задаёт целевую операционную систему, под которую компилируется Go-приложение. Она используется при кросс-компиляции — когда код пишется на одной платформе, а собирается под другую (часто в паре с GOARCH, задающей архитектуру процессора). GOOS=linux GOARCH=amd64 go build Основные значения GOOS (именно в таком виде, в нижнем регистре): linux windows darwin — macOS (не macos) ios android freebsd openbsd netbsd plan9 Полный актуальный список можно получить командой go tool dist list. 🐸 Библиотека Go для собеса0,28%
- 28 июл.❓ Как работает пробинг в Swiss Table 1. Считается хеш ключа и делится на две части. На поддерживаемых CPU используется aeshash, иначе — memhash. Полученный хеш разбивается на: H1 (старшие 57 бит) — выбирает стартовую группу; H2 (младшие 7 бит) — «отпечаток» (fingerprint) ключа. 2. Внутри группы контрольные байты проверяются параллельно через SIMD. Каждая группа — это 8 слотов и 8-байтовый control word, где каждый байт хранит H2 своего слота. Одной SIMD-инструкцией H2 искомого ключа сравнивается сразу со всеми 8 байтами → получаем маску кандидатов. Только для совпавших по fingerprint слотов сверяется полный ключ. 3. Если совпадений нет и пустого слота в группе тоже нет — переходим к следующей группе. Пробинг идёт по группам квадратично, но по треугольным числам: offset = (offset + i) mod size, i = 1, 2, 3, 4... → смещения: h, h+1, h+3, h+6, h+10, ... Такая последовательность гарантированно обходит всю таблицу (при размере — степени двойки) и снижает кластеризацию. Если встретился пустой слот — ключа в таблице нет, поиск останавливается. 🐸 Библиотека Go для собеса0,28%
- 30 июл.❓ Что делает CGO_ENABLED CGO_ENABLED — это переменная окружения, которая включает или выключает CGo при сборке Go-приложений. Принимает два значения: 1 (включено) и 0 (выключено). CGo — это механизм, позволяющий Go-коду взаимодействовать с C: вызывать C-функции и использовать C-библиотеки прямо из Go-программы. Зачем этим управлять: • CGO_ENABLED=0 даёт полностью статический бинарник без зависимостей от системных C-библиотек — удобно для минимальных Docker-образов (scratch, alpine) и упрощает кросс-компиляцию. • CGO_ENABLED=1 нужен, когда проект реально использует C-код или библиотеки, завязанные на cgo CGO_ENABLED=0 GOOS=linux go build -o app Важный нюанс: по умолчанию CGo включён, но при кросс-компиляции (когда GOOS/GOARCH отличаются от хостовых) Go автоматически отключает его, если не задан C-кросс-компилятор. 🐸 Библиотека Go для собеса0,16%
- 4 авг.❓ Объясните разницу между безопасным доступом к байтам строки через срез и использованием unsafe Когда строку преобразуют в срез байтов, создаётся новая копия данных, и доступ к этим данным безопасен, но это также означает, что данные строки не изменяются. unsafe позволяет работать с указателями и памятью напрямую, что даёт больше гибкости, но это также приводит к неопределённому поведению, если использовать эти указатели для изменения данных. 🐸 Библиотека Go для собеса0,15%
- 17 авг.Горутины и каналы: основы параллелизма в Go. Бесплатный урок курса «Go-разработчик. Базовый уровень» Конкурентность — одна из главных особенностей Go, но именно здесь начинающие разработчики чаще всего сталкиваются с трудноуловимыми ошибками. Неправильная работа с горутинами, каналами или синхронизацией может привести к состояниям гонки, взаимным блокировкам и утечкам ресурсов, которые сложно найти и исправить. На открытом уроке 18 августа в 20:00 разберём, как устроен параллелизм в Go и как безопасно использовать горутины в своих проектах. Поговорим о различиях между горутинами и системными потоками, научимся запускать параллельные задачи, организовывать обмен данными через каналы и применять базовые механизмы синхронизации. Урок будет полезен разработчикам, которые хотят уверенно использовать конкурентность Go в реальных приложениях. 👉 Записаться: https://otus.pw/iA0G/?erid=2W5zFGzTDry Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.0,15%