Golang вопросы собеседований
13.5K subscribers
625 photos
3 videos
1 file
432 links
@notxxx1 - админ

@Golang_google - Golang для разработчиков

@itchannels_telegram - 🔥лучшие из ит

@golangl - chat

@golangtests - golang tests

@golang_jobsgo - go chat jobs

@ai_machinelearning_big_data - AI

@data_analysis_ml

РКН: clck.ru/3FmtKd
加入频道
👣 Разобр 50 популярных вопросов с собеседования по Golang

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

https://www.educative.io/blog/50-golang-interview-questions

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Серия собеседований на Middle Go разработчика с Сергеем Парамошкиным (руководит центром разработки и автоматизации в МТС.Digital)

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

🔗Сергей Парамошкин — Даниил
🔗Сергей Парамошкин — Дмитрий Болдин
Коллекция вопросов и ответов на собеседовании по Golang

Github

@golang_interview
34 вопросов и ответов с собеседований Golang

https://www.fullstack.cafe/blog/go-interview-questions

@golang_interview
👣 20 вопросов и ответов на собеседовании по golang для начинающих

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
Что выведет код ?

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

Решение:

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
Наиближайшая сумма трёх

Сложность: Средняя

Условие задачи: Дан целочисленный массив и целевое значение суммы. Нужно найти три числа из массива, которые либо в результате суммирования равны значению целевой суммы либо же максимально близки к ней по модулю.

Каждый массив имеет единственное решение.

Пример:

Ввод:
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
👣 Открытое собеседование на Go-разработчика

Настоящее собеседование на Middle Go разработчика: реальные вопросы, кейсы, задачи. Все происходит так, если бы кандидат пришел на собеседование в команду. Расскажем почему спрашивали именно эти вопросы и как лучше всего подготовиться к собеседованию.

Проведет интервью Александр Сахаров
- Работает в Avito старшим бэкенд разработчиком
- Опыт коммерческой разработки 5 лет. Пишет на Go, PHP, Python. Последние 3 года все больше Go.
- Собеседует разработчиков на разные грейды, от Junior до Senior+

📌 Видео

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Найти максимальный подмассив

Сложность: Средняя

Условие задачи: дан целочисленный массив, необходимо найти в нем такой подмассив, сумма элементов в котором будет максимальной.

Подмассивом называется последовательная часть исходного массива.

Пример:

Ввод:
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. Необходимо вернуть 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"

Решение:

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
👣 golang interview prep

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

В данном репозитории находится рабочее CRUD-приложение, которое содержит множество ошибок, противоречащих современным стандартам, а также серьезные проблемы с безопасностью. Хороший вариант, чтобы попрактиковаться и исправить все ошибки.


🖥 Github

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 В чём разница между пакетами и модулями Golang?

Модуль - это дерево пакетов. Имя модуля задаётся в 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;
● понимание принципов ООП.

Откликайтесь, даже если опыт частично отвечает требованиям. Возможно, у вас есть именно нужные нам навыки.
👣 Какие есть особенности синтаксиса получения и записи значений в map?

Ответ:
Получить значение из map, которую мы предварительно не аллоцировали нельзя, приложение упадет в панику.

Если ключ не найден в map в ответ мы получим дефолтное значение для типа значений map. То есть, для строки - это будет пустая строка, для int - 0 и так далее. Для того, чтобы точно понять, что в map действительно есть значение, хранящееся по переданному ключу, необходимо использовать специальный синтаксис. А именно, возвращать не только само значение, но и булевую переменную, которая показывает удалось-ли получить значение по ключу.


@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Расскажите про утечки памяти в. Go Для чего используется инструмент pprof?

Ответ
Утечки памяти в 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