Серия собеседований на Middle Go разработчика с Сергеем Парамошкиным (руководит центром разработки и автоматизации в МТС.Digital)
Вы увидите реальные вопросы, кейсы и задачи, а также узнаете, почему спрашивали именно эти вопросы и как лучше всего подготовиться к собеседованию.
🔗Сергей Парамошкин — Даниил
🔗Сергей Парамошкин — Дмитрий Болдин
Вы увидите реальные вопросы, кейсы и задачи, а также узнаете, почему спрашивали именно эти вопросы и как лучше всего подготовиться к собеседованию.
🔗Сергей Парамошкин — Даниил
🔗Сергей Парамошкин — Дмитрий Болдин
YouTube
Открытое собеседование на Go-разработчика | Тренировочные интервью
Оставить заявку на менторскую программу Эйч Навыки, чтобы перейти на Go, сменить работу, апнуть грейд или зарплату: https://yangx.top/skills_mentee_bot?start=ordersuccess_video_sZSNf5eVnRA
Подробнее про Эйч Навыки: https://hcareers.notion.site/Go-10-600-4a68…
Подробнее про Эйч Навыки: https://hcareers.notion.site/Go-10-600-4a68…
34 вопросов и ответов с собеседований Golang
https://www.fullstack.cafe/blog/go-interview-questions
@golang_interview
https://www.fullstack.cafe/blog/go-interview-questions
@golang_interview
https://dsysd-dev.medium.com/20-beginner-golang-interview-questions-and-answers-de4ec7108ee
#junior
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет код ?
Решение
@golang_interview
package main
import "fmt"
func reverse(arr [6]int) {
for i, j := 0, len(arr)-1; i < j; i, j = i+1, j-1 {
arr[i], arr[j] = arr[j], arr[i]
}
}
func main() {
arr := [...]int{5: 0}
for i := 1; i < 5; i++ {
arr[i] = i + 1
}
reverse(arr)
fmt.Println(arr)
}
Решение
@golang_interview
💡Задача: Игра в прыжки
Условие: Вам дан целочисленный массив nums. Изначально вы находитесь в первом индексе массива, и каждый элемент массива представляет максимальную длину прыжка в этой позиции.
Верните true, если вы можете добраться до последнего индекса, или false в противном случае.
Пример:
Ввод: nums = [1,3,1,1,4]
Вывод: true
Объяснение: Переходим на 1 шаг от индекса 0 к 1, затем на 3 шага к последнему индексу.
Ввод: nums = [3,2,1,0,4]
Вывод: false
Решение:
Пишите свое решение в комментариях👇
@golang_interview
Условие: Вам дан целочисленный массив nums. Изначально вы находитесь в первом индексе массива, и каждый элемент массива представляет максимальную длину прыжка в этой позиции.
Верните true, если вы можете добраться до последнего индекса, или false в противном случае.
Пример:
Ввод: nums = [1,3,1,1,4]
Вывод: true
Объяснение: Переходим на 1 шаг от индекса 0 к 1, затем на 3 шага к последнему индексу.
Ввод: nums = [3,2,1,0,4]
Вывод: false
Решение:
func canJump(nums []int) bool {
max := 0
for i := 0; i < len(nums); i++ {
if i > max {
return false
}
if i + nums[i] > max {
max = i + nums[i]
}
}
return true
}
Пишите свое решение в комментариях👇
@golang_interview
💫 Несколько мыслей по подготовке к алгоритмической части собеседования
Петр Коробейников, техлид сервисов DBaaS for Redis и RabbitMQ в CloudMTS, делится некоторым опытом подготовки к прохождению алгоритмических интервью с примерами на Go.
📌 Читать
@golang_interview
Петр Коробейников, техлид сервисов DBaaS for Redis и RabbitMQ в CloudMTS, делится некоторым опытом подготовки к прохождению алгоритмических интервью с примерами на Go.
📌 Читать
@golang_interview
Хабр
Несколько мыслей по подготовке к алгоритмической части собеседования
Всем привет! На связи снова Петр Коробейников, техлид сервисов DBaaS for Redis и RabbitMQ (релиз скоро) в #CloudMTS. В этой статье хочу поделиться с вами некоторым опытом подготовки к прохождению...
Наиближайшая сумма трёх
Сложность: Средняя
Условие задачи: Дан целочисленный массив и целевое значение суммы. Нужно найти три числа из массива, которые либо в результате суммирования равны значению целевой суммы либо же максимально близки к ней по модулю.
Каждый массив имеет единственное решение.
Пример:
Ввод:
Вывод:
Объяснение:
Ввод:
Вывод:
Решение:
Временная сложность:
Пространственная сложность:
Пишите свое решение в комментариях👇
@golang_interview
Сложность: Средняя
Условие задачи: Дан целочисленный массив и целевое значение суммы. Нужно найти три числа из массива, которые либо в результате суммирования равны значению целевой суммы либо же максимально близки к ней по модулю.
Каждый массив имеет единственное решение.
Пример:
Ввод:
nums = [-1,2,1,-4], target = 1
Вывод:
2
Объяснение:
(-1 + 2 + 1 = 2)
Ввод:
nums = [0,0,0], target = 1
Вывод:
0
Решение:
func threeSumClosest(nums []int, target int) int {
sort.Ints(nums)
ans := 0
dist := int(^uint(0) >> 1) //dist = infinity
for i :=0; i<len(nums); i++{
l := i+1
r := len(nums)-1
for l < r{
sum := nums[i] + nums[l] + nums[r]
if sum == target{
return sum
}
if sum < target{
l = l + 1
if target - sum < dist{
dist = target-sum
ans = sum
}
}else{
r = r - 1
if sum - target < dist{
dist = sum-target
ans = sum
}
}
}
}
return ans
}
Временная сложность:
O(nlogn)
Пространственная сложность:
O(1)
Пишите свое решение в комментариях👇
@golang_interview
Настоящее собеседование на Middle Go разработчика: реальные вопросы, кейсы, задачи. Все происходит так, если бы кандидат пришел на собеседование в команду. Расскажем почему спрашивали именно эти вопросы и как лучше всего подготовиться к собеседованию.
Проведет интервью Александр Сахаров
- Работает в Avito старшим бэкенд разработчиком
- Опыт коммерческой разработки 5 лет. Пишет на Go, PHP, Python. Последние 3 года все больше Go.
- Собеседует разработчиков на разные грейды, от Junior до Senior+
📌 Видео
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Найти максимальный подмассив
Сложность: Средняя
Условие задачи: дан целочисленный массив, необходимо найти в нем такой подмассив, сумма элементов в котором будет максимальной.
Подмассивом называется последовательная часть исходного массива.
Пример:
Ввод:
Вывод: 6
Объяснение:
Ввод:
Вывод: 23
Решение:
Пишите свое решение в комментариях👇
@golang_interview
Сложность: Средняя
Условие задачи: дан целочисленный массив, необходимо найти в нем такой подмассив, сумма элементов в котором будет максимальной.
Подмассивом называется последовательная часть исходного массива.
Пример:
Ввод:
nums = [-2,1,-3,4,-1,2,1,-5,4]
Вывод: 6
Объяснение:
4,-1,2,1]
имеет наибольшую сумму 6.
Ввод:
nums = [5,4,-1,7,8]
Вывод: 23
Решение:
function maxSubArray(nums: number[]): number {
let [currentSum, largestSum] = [0, nums[0]]
nums.forEach(n => {
currentSum = Math.max(n, currentSum + n)
largestSum = Math.max(currentSum, largestSum)
})
return largestSum
}
Пишите свое решение в комментариях👇
@golang_interview
Сложность: Средняя
Условие задачи: Дан целочисленный массив и целое число k. Необходимо вернуть k часто встречающихся элементов. Порядок чисел в ответе не имеет значения.
Гарантируется, что ответ уникальный. То есть несколько элементов не могут встречаться одинаковое количество раз.
Пример:
Ввод:
nums = [1,1,1,2,2,3], k = 2
Вывод: [1,2]
Ввод:
nums = [1], k = 1
Вывод: [1]
Решение:
func topKFrequent(nums []int, k int) []int {
dict := make(map[int]int)
for _, num := range nums {
dict[num]++
}
arr := [][]int{}
for key, value := range dict {
arr = append(arr, []int{key, value})
}
n := len(arr)
quickSelect(arr,0, n-1, n-k)
res := []int{}
for i := n-k; i < n; i++ {
res = append(res, arr[i][0])
}
return res
}
func quickSelect(arr [][]int, start, end, k int) {
if start < end {
pivot := partition(arr, start, end)
if pivot == k {
return
} else if pivot < k {
quickSelect(arr, pivot+1, end, k)
} else {
quickSelect(arr, start, pivot-1, k)
}
}
}
func partition(arr [][]int, start, end int) int {
idx := start-1
pivot := end
for i := start; i < end; i++ {
if arr[i][1] < arr[pivot][1] {
idx++
arr[idx], arr[i] = arr[i], arr[idx]
}
}
idx++
arr[idx], arr[pivot] = arr[pivot], arr[idx]
return idx
}
O(N
Пространственная сложность:
O(N)
Пишите свое решение в комментариях👇
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
💡Задача: Быки и коровы
Условие задачи: разыгрывается партия, в которой мы просим оппонента угадать число. После первой попытки мы мы говорим другу количество отданных цифр и неотгаданных.
Быки - правильные цифры, находящиеся на нужных позициях.
Коровы - правильные числа, но находящиеся на соответствующих позициях.
Задача - выдать подсказку в формате "xAyB", где x - количество быков, y - количество коров.
Пример:
Ввод: secret = "1807", guess = "7810"
Вывод: "1A3B"
Объяснение:
Ввод: secret = "1123", guess = "0111"
Вывод: "1A1B"
Решение:
пишите свое решение в комментариях 👇
@golang_interview
Условие задачи: разыгрывается партия, в которой мы просим оппонента угадать число. После первой попытки мы мы говорим другу количество отданных цифр и неотгаданных.
Быки - правильные цифры, находящиеся на нужных позициях.
Коровы - правильные числа, но находящиеся на соответствующих позициях.
Задача - выдать подсказку в формате "xAyB", где x - количество быков, y - количество коров.
Пример:
Ввод: secret = "1807", guess = "7810"
Вывод: "1A3B"
Объяснение:
Ввод: secret = "1123", guess = "0111"
Вывод: "1A1B"
Решение:
func getHint(secret string, guess string) string {
digits := [10]int{}
bulls, cows := 0, 0
for i := 0; i < len(secret); i++ {
s := secret[i] - '0'
g := guess[i] - '0'
if s == g {
bulls++
} else {
if digits[s] < 0 {
cows++
}
if digits[g] > 0 {
cows++
}
digits[s]++
digits[g]--
}
}
return fmt.Sprintf("%dA%dB", bulls, cows)
}
пишите свое решение в комментариях 👇
@golang_interview
Репозиторий, который создан для того, чтобы готовиться к собеседованию на Go на практике.
В данном репозитории находится рабочее CRUD-приложение, которое содержит множество ошибок, противоречащих современным стандартам, а также серьезные проблемы с безопасностью. Хороший вариант, чтобы попрактиковаться и исправить все ошибки.
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Модуль - это дерево пакетов. Имя модуля задаётся в go.mod
Пакет - это набор исходных .go файлов, находящихся в одном каталоге и с одинаковой директивой package.
Файлы для одного пакета обязаны находиться в одном каталоге. Полное имя для пакета строится из имени модуля и пути к каталогу с файлами. Например,
в go.mod написано module example.org/mylib, тогда все пакеты из модуля example.org/mylib должны быть в дочерних каталогах относительно go.mod.
и путь к каталогу определяет имя пакета.
Например, в дереве исходников вашей библиотеки есть файлы в каталоге ./cmd/root.
Тогда эти файлы должны быть либо с директивой package root, либо package root_test. И полное имя пакета для этих файлов будет либо
example.org/mylib/cmd/root, либо example.org/mylib/cmd/root_test[1].
Для автоматического поиска пакетов в Гугле придумали протокол goproxy Он реализован в GitHub, поэтому любой модуль, размещённый там, автоматически будет найден командами go get, go mod tidy, go build и подобными.
Но никто не ограничивает вас пользоваться только гитхабом. К примеру, поддержка goproxy есть в GitLab. Разворачиваете у себя на сервере гитлаб, настраиваете домены и прокси - и готово, go get начинает находить модули с вашим доменным именем.
На худой конец можно развернуть исходники стороннего модуля у себя в файловой системе, а в go.mod прописать зависимость с replace:
require example.org/some/module v1.01.02
replace example.org/some/module => ../some_module_src
В этом случае go build вообще не полезет в интернет, а возьмёт исходники модуля example.org/some/module из каталога ../some_module_src
[1] Пакет
example.org/mylib/cmd/root_test
должен содержать тесты для пакета example.org/mylib/cmd/root#junior
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Вакансии направления Go – разрабатывай внутренние и B2B в Kaspersky!
Чем будете заниматься:
● Golang developer (Sandbox) – разрабатывать микросервисы на Go, участвовать в создании нового функционала проекта и подготовке релизов новых версий продукта;
● Go Developer (MSAP) – участвовать в разработке и поддержка бекенд сервисов под Linux/Kubernetes на Go;
● Golang developer – участвовать в разработке микросервисов, работать с имеющимися проектами;
● Golang developer (OSMP) – создавать бекенд сервисы под Linux/Kubernetes на Go, развивать микро-сервисный подход, писать тесты, проводить код-ревью.
Основные требования:
● опыт от 2х лет разработки на GO или другом языке (С++, С#, Java);
● опыт разработки микросервисов;
● опыт разработки под Linux;
● понимание принципов ООП.
Откликайтесь, даже если опыт частично отвечает требованиям. Возможно, у вас есть именно нужные нам навыки.
Чем будете заниматься:
● Golang developer (Sandbox) – разрабатывать микросервисы на Go, участвовать в создании нового функционала проекта и подготовке релизов новых версий продукта;
● Go Developer (MSAP) – участвовать в разработке и поддержка бекенд сервисов под Linux/Kubernetes на Go;
● Golang developer – участвовать в разработке микросервисов, работать с имеющимися проектами;
● Golang developer (OSMP) – создавать бекенд сервисы под Linux/Kubernetes на Go, развивать микро-сервисный подход, писать тесты, проводить код-ревью.
Основные требования:
● опыт от 2х лет разработки на GO или другом языке (С++, С#, Java);
● опыт разработки микросервисов;
● опыт разработки под Linux;
● понимание принципов ООП.
Откликайтесь, даже если опыт частично отвечает требованиям. Возможно, у вас есть именно нужные нам навыки.
Ответ:
Если ключ не найден в map в ответ мы получим дефолтное значение для типа значений map. То есть, для строки - это будет пустая строка, для int - 0 и так далее. Для того, чтобы точно понять, что в map действительно есть значение, хранящееся по переданному ключу, необходимо использовать специальный синтаксис. А именно, возвращать не только само значение, но и булевую переменную, которая показывает удалось-ли получить значение по ключу.
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Ответ
Утечки памяти в Go могут принимать разные формы.
Обычно мы считаем, что это баги, однако истинная причина проблем может быть заложена ещё на стадии проектирования.
Приведем распространённые примеры появления проблем с памятью:
• неверное представление данных;
• интенсивное применение рефлексии либо строк;
• применение глобальных переменных;
• бесконечные горутины.
Самый простой способ создать утечку памяти в Go — определить глобальную переменную, массив, и добавить в него данные.
Golang предлагает инструмент с именем pprof. Он может помочь обнаружить проблемы с памятью. Он также может быть использован при обнаружении проблем в работе процессора.
нструмент pprof создаёт файл дампа, куда кладёт сэмпл кучи. Данный файл вы сможете в итоге проанализировать/визуализировать, чтобы позволит получить карту:
• текущего выделения памяти;
• накопительного (общего) выделения памяти.
Кроме того, у pprof есть возможность сравнивать снимки, которые сделаны в разное время. Это бывает полезно при определении проблемных областей кода при стрессовых сценариях.
Профили pprof
Инструмент pprof функционирует с помощью профилей. Под профилем понимается набор трассировок стека, которые показывают последовательности вызовов, ставших причиной появления определённого события, к примеру, выделения памяти. Подробная информация о реализации профилей содержится в файле runtime/pprof/pprof.go.
Язык программирования Go имеет целый перечень встроенных профилей, которые вы можете применять в стандартных ситуациях:
• goroutine — следы всех текущих горутин;
• allocs — выборка всех предыдущих выделений памяти;
• heap — выборка выделений памяти живых объектов;
• threadcreate — следы стека, ставшие причиной создания новых потоков в ОС;
• mutex — следы стека держателей конфликтующих мьютексов;
• block — следы стека, ставшие причиной блокировки примитивов синхронизации.
Heap
Heap (куча) представляет собой абстрактное представление места, в котором ОС хранит объекты, использующие код. В дальнейшем эта память очищается сборщиком мусора либо освобождается вручную.
Однако куча не является единственным местом, где осуществляется выделение памяти — часть памяти выделяется и на стеке. В языке программирования Go стек обычно используют для присвоений, которые происходят в рамках работы функции. Также в Go используется стек в случае, когда компилятор «знает», сколько конкретно памяти надо зарезервировать перед выполнением (к примеру, для массивов фиксированного размера).
При этом данные кучи должны быть освобождены с применением сборки мусора, а вот данные стека — нет. Именно поэтому гораздо эффективнее применять стек там, где это представляется возможным.
Получаем данные кучи посредством pprof
Существуют 2 основных способа получить данные. Первый, как правило, применяют в качестве части теста — он включает импорт runtime/pprof с последующим вызовом pprof.WriteHeapProfile(some_file) в целях записи информации в кучу.
// Функция lookup() берёт профиль
namepprof.Lookup("heap").WriteTo(some_file, 0)
Здесь
WriteHeapProfile()
существует для обратной совместимости. Однако прочие профили таких возможностей не имеют, поэтому для получения данных профилей вам следует применять функцию Lookup().
Другой способ — пустить его через HTTP (по web-адресу). Этот способ позволяет извлекать определённые данные из запущенного контейнера в тестовой среде либо e2e-среде или даже из production. При этом всю документацию пакета pprof вы можете и не читать, но как его включить, вы знать должны.
import (
"net/http"
_ "net/http/pprof"
)
...
func main() {
...
http.ListenAndServe("localhost:8080", nil)
}
Напишите в комментариях какие альтернативы pprof вам известны👇
#junior
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Полный курс Golang разработчика 2023 года. Часть1.
1. О курсе - https://www.youtube.com/watch?v=Nv0vmR5OqRg&t=34s
2. Установка GO - https://www.youtube.com/watch?v=gi6gAhzUhUg
3. Пакеты в Golang https://www.youtube.com/watch?v=RNVhf-zBpdQ
4. Типы данных в Go - https://www.youtube.com/watch?v=_ilP500FEP8&t=16s
5. Строки и руны - https://www.youtube.com/watch?v=wUQB74nNxos&t=27s
6. Инструменты CLI- https://www.youtube.com/watch?v=LzqVFx6yOAs&t=8s
7. Введение в переменные - https://www.youtube.com/watch?v=zQa85CrYQJ4&t=190s
8. Переменные на практике - https://www.youtube.com/watch?v=P9Lk0EiO2pU&t=1s
9. Упражнения с переменными -
https://www.youtube.com/watch?v=huj6RHQC34I&t=1s
10. Работа с функциями - https://www.youtube.com/watch?v=euudha7zAiU&t=7s
11. Функции на практике - https://www.youtube.com/watch?v=YdoMOD6H_nk
12. Управление потоками с операторами if else - https://www.youtube.com/watch?v=Mq6WQy_eq_k&t=1s
13. Оператор Switch - https://www.youtube.com/watch?v=4REsob985vc
14. Циклы - https://www.youtube.com/watch?v=gpt8IGahbXo
15. Структуры - https://www.youtube.com/watch?v=VrOflBI4f_E&t=311s
16. Массивы - https://www.youtube.com/watch?v=QrVHFGtCAnE
17. Срезы - https://www.youtube.com/watch?v=XA1WFY1kv2o&t=671s
18. Карты - https://www.youtube.com/watch?v=XA1WFY1kv2o&list=PLysMDSbb9HcxpAb8lhnMaRpX890wSLz66&index=18
19.Указатели - https://www.youtube.com/watch?v=LYFOJhP28Ro
20. Методы - https://www.youtube.com/watch?v=hmWwp04_XC0
21. IOTA - https://www.youtube.com/watch?v=La67BqQdoys
22.FMT - https://www.youtube.com/watch?v=-Ie4-R23VTk
23.INIT - https://www.youtube.com/watch?v=riIi-FpSOuc
24 Тесты- https://www.youtube.com/watch?v=AprUuq_rm0I
25 Интерфейсы - https://www.youtube.com/watch?v=Amun1J6KE3Q&t=70s
26. Обработка ошибок - https://www.youtube.com/watch?v=VTmHbN0Y4aU
Полный плейлист
📌Курс на stepik
Полный плейлист - https://www.youtube.com/watch?v=XyVihrOSN80&list=PLysMDSbb9HcxpAb8lhnMaRpX890wSLz66&index=19
📌Курс на stepik
@golang_interview
1. О курсе - https://www.youtube.com/watch?v=Nv0vmR5OqRg&t=34s
2. Установка GO - https://www.youtube.com/watch?v=gi6gAhzUhUg
3. Пакеты в Golang https://www.youtube.com/watch?v=RNVhf-zBpdQ
4. Типы данных в Go - https://www.youtube.com/watch?v=_ilP500FEP8&t=16s
5. Строки и руны - https://www.youtube.com/watch?v=wUQB74nNxos&t=27s
6. Инструменты CLI- https://www.youtube.com/watch?v=LzqVFx6yOAs&t=8s
7. Введение в переменные - https://www.youtube.com/watch?v=zQa85CrYQJ4&t=190s
8. Переменные на практике - https://www.youtube.com/watch?v=P9Lk0EiO2pU&t=1s
9. Упражнения с переменными -
https://www.youtube.com/watch?v=huj6RHQC34I&t=1s
10. Работа с функциями - https://www.youtube.com/watch?v=euudha7zAiU&t=7s
11. Функции на практике - https://www.youtube.com/watch?v=YdoMOD6H_nk
12. Управление потоками с операторами if else - https://www.youtube.com/watch?v=Mq6WQy_eq_k&t=1s
13. Оператор Switch - https://www.youtube.com/watch?v=4REsob985vc
14. Циклы - https://www.youtube.com/watch?v=gpt8IGahbXo
15. Структуры - https://www.youtube.com/watch?v=VrOflBI4f_E&t=311s
16. Массивы - https://www.youtube.com/watch?v=QrVHFGtCAnE
17. Срезы - https://www.youtube.com/watch?v=XA1WFY1kv2o&t=671s
18. Карты - https://www.youtube.com/watch?v=XA1WFY1kv2o&list=PLysMDSbb9HcxpAb8lhnMaRpX890wSLz66&index=18
19.Указатели - https://www.youtube.com/watch?v=LYFOJhP28Ro
20. Методы - https://www.youtube.com/watch?v=hmWwp04_XC0
21. IOTA - https://www.youtube.com/watch?v=La67BqQdoys
22.FMT - https://www.youtube.com/watch?v=-Ie4-R23VTk
23.INIT - https://www.youtube.com/watch?v=riIi-FpSOuc
24 Тесты- https://www.youtube.com/watch?v=AprUuq_rm0I
25 Интерфейсы - https://www.youtube.com/watch?v=Amun1J6KE3Q&t=70s
26. Обработка ошибок - https://www.youtube.com/watch?v=VTmHbN0Y4aU
Полный плейлист
📌Курс на stepik
Полный плейлист - https://www.youtube.com/watch?v=XyVihrOSN80&list=PLysMDSbb9HcxpAb8lhnMaRpX890wSLz66&index=19
📌Курс на stepik
@golang_interview
go install golang.org/dl/go1.21rc2@latest
~/go/bin/go1.21rc2 download
export GOROOT=/Users/jason/sdk/go1.21rc2/
https://www.dolthub.com/blog/2023-07-07-golang-1.21-release/
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM