fa
Feedback
Библиотека Go для собеса | вопросы с собеседований

Библиотека Go для собеса | вопросы с собеседований

رفتن به کانال در Telegram

Вопросы с собеседований по Go и ответы на них. Учиться у нас: clc.to/iEeaZw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197

نمایش بیشتر
7 428
مشترکین
-524 ساعت
-77 روز
+630 روز
آرشیو پست ها
💬 Что из себя представляет Pub/Sub модель обмена сообщениями? Это архитектурный шаблон, используемый в распределённых системах для асинхронного обмена сообщениями между компонентами системы через посредника, известного как брокер сообщений. 🔹 Издатели отправляют сообщения в определённые каналы или темы, управляемые брокером. Они не имеют информации о подписчиках и их количестве, что позволяет легко добавлять новые источники данных без изменения общей системы. 🔹 Подписчики регистрируются для получения сообщений из одной или нескольких тем. Они получают сообщения автоматически от брокера, когда издатели отправляют данные в те темы, на которые они подписаны. Это позволяет им реагировать на новые данные в реальном времени. 🔹 Брокер действует как посредник между издателями и подписчиками, управляя подписками и обеспечивая доставку сообщений к подписчикам. Брокер обеспечивает децентрализацию, масштабируемость и устойчивость системы, отвечая за буферизацию сообщений, управление трафиком и обработку ошибок.

Открытое собеседование на Gо-разработчика 18 апреля(уже в четверг!!) в 19:00 по мск приходи онлайн на Открытое собеседование
Открытое собеседование на Gо-разработчика 18 апреля(уже в четверг!!) в 19:00 по мск приходи онлайн на Открытое собеседование от Эйч Навыков. Как это будет: 1. Сергей Парамошкин, Deputy CTO в Yandex Cloud и ментор Эйч Навыков, позадает реальные вопросы и задачи разработчику-добровольцу 2. Потом Сережа даст подробную обратную связь — объяснит, зачем задавал тот или иной вопрос, как лучше на него ответить или решить задачу 3. В конце можно будет задать любой вопрос Сереже Что узнаешь на Открытом собеседовании: - Чего ждут от кандидатов на мидл-позиции в Gо-разработке - Какие вопросы задают на интервью и зачем - Как подготовиться к собесу, чтобы получить заветный оффер Это бесплатно? Бесплатно Просто зарегистрируйся на открытое собеседование в нашем боте @skills_mentee_bot Реклама: ООО “Эйч Карьера” erid: LjN8KJ75Q

💬 Когда процесс может не реагировать на SIGKILL в Unix-подобных операционных системах, включая Linux? Сигнал SIGKILL (`kill -9`) предназначен для немедленного принудительного завершения процесса и не может быть перехвачен или обработан программно, что обеспечивает его высокую надежность. Однако существуют особые случаи, когда процесс может не реагировать на SIGKILL: 1. Зомби-процессы: если процесс уже завершил выполнение и находится в состоянии "зомби", он не будет реагировать на SIGKILL, так как фактически уже завершен и ждет очистки из таблицы процессов. 2. Процессы, ожидающие завершения ввода-вывода на уровне ядра: если процесс застрял в незавершенной операции ввода-вывода в ядре, SIGKILL может не остановить процесс до тех пор, пока системный вызов не вернется из ядра. 3. Процессы в непрерывном взаимодействии с аппаратным обеспечением: аналогично предыдущему пункту, если процесс находится в состоянии ожидания аппаратного события, которое не происходит, ядро может не суметь прервать эту блокировку, и процесс продолжит висеть. 4. Процесс является процессом init, не получающим от ОС сигналов, которые он не хочет обрабатывать. Процесс init может игнорировать SIGKILL, так как он является особым процессом, который отвечает за запуск и завершение других процессов.

Самые полезные каналы для программистов в одной подборке! Сохраняйте себе, чтобы не потерять 💾 🔥Для всех Библиотека программиста — новости, статьи, досуг, фундаментальные темы Книги для программистов IT-мемы Proglib Academy — тут мы рассказываем про обучение и курсы 🤖Про нейросети Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка Библиотека нейротекста | ChatGPT, Gemini, Bing Библиотека нейровидео | Sora AI, Runway ML, дипфейки Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion #️⃣C# Книги для шарпистов | C#, .NET, F# Библиотека шарписта — полезные статьи, новости и обучающие материалы по C# Библиотека задач по C# — код, квизы и тесты Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel ☁️DevOps Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps Вакансии по DevOps & SRE Библиотека задач по DevOps — код, квизы и тесты Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования 🐘PHP Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP Вакансии по PHP, Symfony, Laravel Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по PHP — код, квизы и тесты 🐍Python Библиотека питониста — полезные статьи, новости и обучающие материалы по Python Вакансии по питону, Django, Flask Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по Python — код, квизы и тесты ☕Java Книги для джавистов | Java Библиотека джависта — полезные статьи по Java, новости и обучающие материалы Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по Java — код, квизы и тесты Вакансии для java-разработчиков 👾Data Science Книги для дата сайентистов | Data Science Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по Data Science — код, квизы и тесты Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту 🦫Go Книги для Go разработчиков Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по Go — код, квизы и тесты Вакансии по Go 🧠C++ Книги для C/C++ разработчиков Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++ Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования Библиотека задач по C++ — код, квизы и тесты Вакансии по C++ 💻Другие каналы Библиотека фронтендера Библиотека мобильного разработчика Библиотека хакера Библиотека тестировщика Вакансии по фронтенду, джаваскрипт, React, Angular, Vue Вакансии для мобильных разработчиков Вакансии по QA тестированию InfoSec Jobs — вакансии по информационной безопасности 📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈 Также у нас есть боты: Бот с IT-вакансиями Бот с мероприятиями в сфере IT Мы в других соцсетях: 🔸VK 🔸YouTube 🔸Дзен 🔸Facebook * 🔸Instagram * * Организация Meta запрещена на территории РФ

💬 Гарантирует ли порядок выполнения конструкция select-case в Go? Конструкция select-case в Go не гарантирует порядок выполнения своих веток. Если в нескольких кейсах операции готовы к выполнению одновременно, выбор конкретного кейса для выполнения происходит случайным образом. Это помогает предотвратить блокировку и гарантировать, что все горутины имеют равные шансы на выполнение. Если ни один из кейсов не готов, программа будет ждать, пока хотя бы один кейс не станет доступен, если только не предоставлен кейс default, который выполняется немедленно, когда другие кейсы не готовы.

💬 Что из себя представляют термины "zombie" и "orphan" в контексте операционной системы Linux? Они описывают два различных состояния процессов: 1. Zombie process (зомби-процесс) — процесс, который завершил свое выполнение, но все еще присутствует в системе в качестве записи в таблице процессов. Это происходит потому, что процесс завершился, но его родительский процесс еще не вызвал системный вызов wait(), который "собирает" статус завершения процесса-потомка. Пока родитель не вызовет wait(), зомби-процесс будет оставаться в системе с освобожденными ресурсами, но сохранившейся записью в таблице процессов. Это состояние позволяет родителю получить информацию о статусе завершения процесса-потомка. 2. Orphan Process (процесс-сирота) — процесс, чей родительский процесс завершился, оставив процесс без непосредственного предка в системе. В Linux и других UNIX-подобных системах, когда родительский процесс завершается, все его «сиротские» дочерние процессы автоматически «усыновляются» процессом с PID 1, который обычно является процессом init или его современной заменой, например, systemd. Этот процесс становится новым родителем процессов-сирот и отвечает за их завершение и очистку ресурсов.

💬 Имеет ли значение порядок полей в структуре Go? Да, порядок полей в структуре в Go имеет значение, особенно когда речь идет о выравнивании памяти и оптимизации использования памяти. В Go, компилятор учитывает выравнивание памяти, чтобы обеспечить более эффективный доступ к данным и уменьшить объем занимаемой памяти. 📌 Несколько аспектов, по которым порядок полей может быть важен: 1. Каждый тип данных имеет требования к выравниванию, что значит, что данные этого типа должны начинаться с определенного адреса в памяти. Например, тип int64 в Go обычно требует выравнивания по 8-байтной границе. Если поля в структуре расположены таким образом, что между полями образуются "дыры" из-за выравнивания, это может привести к неэффективному использованию памяти. 2. Порядок полей может влиять на общий размер структуры из-за вышеупомянутых "дыр". Путем рационального упорядочивания полей можно минимизировать эти "дыры" и сделать размер структуры меньше. 3. Эффективное выравнивание памяти может улучшить производительность приложения, так как процессоры обращаются к выровненной памяти быстрее. Неправильное выравнивание может привести к дополнительным затратам циклов процессора для доступа к данным.

💬 В каких кейсах используется указатель на структуру в Go? 1. Когда структура передается в функцию по значению, Go создаёт её копию. Чтобы изменения внутри функции отражались на самой структуре, следует передавать указатель на неё. 2. Передача структур через указатели эффективнее по памяти, особенно для больших структур, потому что передается только адрес памяти, а не вся структура. 3. Использование указателей может улучшить производительность программы, снижая накладные расходы на копирование больших структур данных при передаче их между функциями. 4. Указатели на структуры могут быть nil, что позволяет использовать их для реализации опциональных полей или для указания на отсутствие конкретного значения. 5. Структуры могут реализовывать интерфейсы, и указатели на эти структуры могут быть переданы функциям, ожидающим интерфейс. Это позволяет работать с разными типами данных через общий интерфейс.

Ищем Middle и Senior Гоферов, чтобы проводить собесы и менторить Ищем в Эйч Навыки — это менторская программа от гоферов для гоферов. Мы уже провели 200+ мок-интервью, но желающих пройти собес всё больше и больше, а нас, если честно, уже тупо не хватает на всех. Поэтому пришли сюда — чтобы найти новых классных коллег-менторов, которые хотят внести вклад в комьюнити и вырасти, обучая других. И готовы на доп занятость, пару часов в день. Надо будет проводить тестовые интервью с другими Go-разработчиками → оценивать уровень этих ребят → помогать им расти дальше. Для этого всего мы разработали систему грейдов и форму обратной связи. Если ты до этого никого не менторил, вообще не переживай — всему научим. Что взамен: 🔘 От 40К за 5-7 часов работы в неделю 🔘 Доступ к обучению и комьюнити других сильных менторов из Яндекса, Авито, Uber, Tinkoff и других 🔘 Возможность выступать на нашем YouTube-канале (у нас в среднем 5000 просмотров на видео) — так станешь заметнее на рынке 🔘 Жесткая прокачка софтов + классная строчка в резюме. «Провел(а) 100+ собеседований» — звучит круто, работодатели точно оценят. Если хочешь попробовать себя в роли ментора, заполни форму — мы свяжемся с тобой ➡️ https://forms.gle/EBe9EMrcj8ew1t5H6 Реклама: ООО “Эйч Карьера” erid: LjN8KJ75Q

💬 Как в Go преобразовать строку в число и обратно, и как обрабатывать возможные ошибки при этих преобразованиях? В Go для преобразования строки в число и обратно используются функции из пакета strconv. При преобразовании строки в число необходимо учитывать возможные ошибки, так как входная строка может не быть корректно преобразована в числовой формат. 🔹 Преобразование строки в число Чтобы преобразовать строку в число, можно использовать функции как strconv.Atoi для целых чисел или strconv.ParseFloat для чисел с плавающей точкой.

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // Преобразование строки в целое число
    strInt := "123"
    intValue, err := strconv.Atoi(strInt)
    if err != nil {
        fmt.Println("Ошибка преобразования:", err)
    } else {
        fmt.Println("Целое число:", intValue)
}

    // Преобразование строки в число с плавающей точкой
    strFloat := "123.45"
    floatValue, err := strconv.ParseFloat(strFloat, 64) // 64 указывает на то, что результат будет float64
    if err != nil {
        fmt.Println("Ошибка преобразования:", err)
    } else {
        fmt.Println("Число с плавающей точкой:", floatValue)
    }
}
🔹 Преобразование числа в строку Для преобразования числа в строку используется функция strconv.Itoa для целых чисел или fmt.Sprintf для чисел с плавающей точкой или других форматов. Например:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // Преобразование целого числа в строку
    intValue := 123
    strInt := strconv.Itoa(intValue)
    fmt.Println("Строка:", strInt)

    // Преобразование числа с плавающей точкой в строку
    floatValue := 123.45
    strFloat := fmt.Sprintf("%f", floatValue)
    fmt.Println("Строка:", strFloat)
}

💬 Как удалить элемент из среза в Go без использования стандартной библиотеки? 👉 Если порядок важен Чтобы удалить элемент из середины среза и сохранить порядок оставшихся элементов, можно использовать append:

newSlice := append(slice[:index], slice[index+1:]...)
Это объединяет часть среза до удаляемого элемента с частью среза после удаляемого элемента, исключая сам удаляемый элемент, но сохраняя порядок оставшихся элементов. 👉 Если порядок не важен В случае, когда сохранение исходного порядка элементов не является приоритетом, можно выполнить удаление элемента, заменив его последним элементом среза, а затем уменьшить длину среза. Это эффективнее, так как не требует перемещения элементов:

slice[index] = slice[len(slice)-1]
newSlice := slice[:len(slice)-1]
Этот метод эффективно удаляет элемент, заменяя его последним элементом среза, и уменьшает размер среза, исключая последний элемент. 👉 Удаление из начала или конца Если элемент для удаления находится в начале или в конце среза, можно просто использовать срезы: 📌 Для удаления первого элемента:

newSlice := slice[1:]
📌 Для удаления последнего элемента:

newSlice := slice[:len(slice)-1]

🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи Напоминаем, что у нас есть бесплатный курс для всех, кто хо
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом. Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций. Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах. 👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.

💬 Почему порядок обхода элементов в map является случайным? Главная причина — предотвращение зависимости от порядка элементов. При итерации по элементам map, Go специально не гарантирует никакого порядка. Это сделано, чтобы разработчики не полагались на порядок при написании кода, что могло бы привести к непредсказуемым багам при изменении содержимого мапы. Случайность порядка обхода напоминает разработчикам о том, что структура данных map не предназначена для хранения элементов в упорядоченном виде. Внутренняя реализация map в Go предназначена для быстрого доступа, добавления и удаления элементов, а не для поддержания элементов в определенном порядке. Эффективность операций с мапой имеет более высокий приоритет, чем сохранение порядка элементов.

💬 Реализуйте функции Min(x, y int)и Max(x, y int), которые принимают два целых числа и возвращают меньшее или большее значение соответственно. В стандартной библиотеке Go функции math.Min и math.Max работают с числами с плавающей запятой. Для работы с целыми числами можно легко реализовать собственные функции Min и Max. Вот простой пример:
package main

import (
    "fmt"
)

func Min(x, y int) int {
    if x < y {
        return x
    }
    return y
}

func Max(x, y int) int {
    if x > y {
        return x
    }
    return y
}

func main() {
    fmt.Println(Min(2, 3)) // Выведет: 2
    fmt.Println(Max(2, 3)) // Выведет: 3
}

Avito Golang meetup #4 17 апреля в 19:00 мск Бронируйте место и не пропустите: – кейс по управлению конфигурациями в DevPlatf
Avito Golang meetup #4 17 апреля в 19:00 мск Бронируйте место и не пропустите: – кейс по управлению конфигурациями в DevPlatform с помощью kubernetes-оператора; – обзор планировщика Golang и модели GMP; – мастер-класс по написанию плагинов с Protobuf. Это стоит увидеть, услышать и опробовать в своих проектах.

💬 Почему Go выбирают для облачной разработки и решения задач DevOps? ☑️ Обширная стандартная библиотека ☑️ Кросс-платформенная компиляция ☑️ Экосистема и инструментарий (управление зависимостями, обработка ошибок, тестирование, профилирование и многое другое) ☑️ Простота и скорость разработки ☑️ Сборка мусора, о которой не надо задумываться ☑️ Строгая типизация ☑️ Встроенная поддержка конкурентности ☑️ Высокая производительность Пишите в комментарии, если хотите что-то добавить/исправить👇

💬 Даны два канала. В первый пишутся числа. Необходимо, чтобы числа читались из первого по мере поступления, что-то с ними происходило и результат записывался во второй канал.  Для решения этой задачи можно использовать горутину, которая будет читать числа из первого канала, выполнять некоторую операцию с каждым числом (например, умножать его на 2) и отправлять результат во второй канал. 📌 Вот пример решения на Go:
package main

import (
 "fmt"
)

func processNumbers(input <-chan int, output chan<- int) {
 for num := range input {
  // Пример операции: умножаем число на 2
  result := num * 2
  output <- result
 }
 close(output)
}

func main() {
 inputChannel := make(chan int)
 outputChannel := make(chan int)

 go processNumbers(inputChannel, outputChannel)

 // Отправляем числа в первый канал
 go func() {
  for i := 1; i <= 5; i++ {
   inputChannel <- i
  }
  close(inputChannel)
 }()

 // Читаем результаты из второго канала
 for result := range outputChannel {
  fmt.Println(result)
 }
}
🔹 Функция processNumbers принимает два канала: input для чтения и output для записи. Она читает каждое число из input, умножает его на 2 и отправляет результат в output. После обработки всех чисел она закрывает канал output. 🔹 В функции main, создаются два канала: inputChannel и outputChannel. 🔹 Горутина processNumbers запускается для обработки чисел, передавая ей эти каналы. 🔹 В отдельной горутине числа от 1 до 5 отправляются в inputChannel, после чего канал закрывается. 🔹 В основной горутине читаются и выводятся результаты из outputChannel.

💡Как тривиально проверить значения интерфейса на nil? В Go новички часто сталкиваются с проблемой интерфейсных переменных, которым присваивается nil указатель. В таком случае, хотя значение в интерфейсе является nil, сама переменная интерфейса не равна nil. Пример: создаем переменную x как указатель на int, который по умолчанию nil, и переменную y как пустой интерфейс, который тоже nil по умолчанию. После присваивания x переменной y, интерфейс y уже не является nil, хотя x все еще nil.

var x *int
var y any
y = x
📌 Что вернет y == nil? Вернет false. Это потому, что интерфейс не просто представляет значение, которое ему присвоено, а действует как контейнер для этого значения. Для проверки, является ли значение в интерфейсе nil, нужно использовать утверждение типа. Например, для проверки y на nil, используем:

y.(*int) == nil
Это показывает, что интерфейс y не nil, но содержащееся в нем значение — nil. Полный пример здесь. #tip

Что нужно для счастья разработчику на Go? Интересные задачи в продуктовой разработке, когда результат можно буквально «потрогать» в виде сервера, системы хранения данных или планшета? Большое сообщество коллег, с которыми можно развиваться? Или, может, просто комфортное рабочее место — в одном из классных офисов или у себя дома?  Чтобы не выбирать что-то одно, можно прийти работать в YADRO — компанию-производителя IT-инфраструктуры, пользовательского и телеком-оборудования. На видео один из гоферов компании как раз рассказывает об актуальных задачах и жизни разработчиков в инженерной компании.   Оставить резюме можно здесь: https://clck.ru/39g5Vz   Ждут как тимлидов команд разработки, так и начинающих специалистов. Реклама. ООО «КНС ГРУПП», ИНН 7701411241, www.yadro.com erid: 2SDnjdLM5ow

💬 Для чего предназначен пакет unsafe в Go? Пакет unsafe в Go предназначен для выполнения операций, которые выходят за рамки типобезопасного программирования, предоставляемого Go. Это позволяет напрямую работать с памятью. unsafe используется для оптимизации или для взаимодействия с кодом, написанным на других языках, когда необходимо точное управление размещением и интерпретацией данных в памяти. Однако использование unsafe — это легкий способ выстрелить себе в ногу, поэтому нужно соблюдать определенные правила. 📌 Простой пример:

package main

import (
    "fmt"
    "reflect"
    "unsafe"
)

func stringToBytes(s string) []byte {
    // Получаем строковый заголовок
    stringHeader := (*reflect.StringHeader)(unsafe.Pointer(&s))

    // Преобразуем его в заголовок среза байтов
    sliceHeader := reflect.SliceHeader{
        Data: stringHeader.Data,
        Len:  stringHeader.Len,
        Cap:  stringHeader.Len,
    }

    // Возвращаем срез, созданный на основе заголовка среза
    return *(*[]byte)(unsafe.Pointer(&sliceHeader))
}

func main() {
    s := "Hello, World!"
    b := stringToBytes(s)

    fmt.Println(s)  // Выведет: Hello, World!
    fmt.Println(b)  // Выведет: [72 101 108 108 111 44 32 87 111 114 108 100 33]
}
Пример демонстрирует использование unsafe для прямого преобразования строк в срезы байтов без создания копии данных. Он работает, изменяя способ, которым Go интерпретирует область памяти, занимаемую строкой, трактуя ее как срез байтов. Это может быть полезно в ситуациях, где необходимо избежать дополнительного копирования данных для повышения производительности, но требуется осторожное обращение, поскольку любые изменения в возвращаемом срезе байтов могут повлиять на исходную строку и наоборот, что нарушает иммутабельность строк в Go и может привести к неопределенному поведению.