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
加入频道
💡Задача: Игра в прыжки

Условие: Вам дан целочисленный массив 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
👣 Описание наиболее важных обновление последней версии Go.

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
🖥 Как масштабировать контейнер?

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

Пример: Системные администраторы могут масштабировать контейнеры Docker, изменяя количество контейнеров или количество ресурсов, выделяемых каждому контейнеру. Чтобы изменить количество контейнеров, можно использовать команду 'docker-compose up' с флагом '--scale'.

Чтобы настроить количество ресурсов, можно использовать команду docker run с флагами '--memory' и '--cpu-shares'. Ограничением, которое может возникнуть в процессе масштабирования, является память. Для успешного масштабирования пакета Docker контейнеру может потребоваться достаточно памяти, чтобы справиться с возросшей вычислительной мощностью.

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Какая сложность у следующего
алгоритма?

func reverse(n []int) {
length := len(n)

for i := 0; i < length / 2; i++ {
other := length - i - 1
temp := n[i]

n[i] = n[other]
n[other] = temp
}
}

func reverse(n []int) {
for n / 2 раз
}


Думаете O(log n)? Казалось бы да, но нет.

Ответ: O(n/2), т.к. мы просто один раз берем половину элементов массива и итерируем их, скажем было 100 элементов взяли половину - 50, для Big O это все те же n элементов, следовательно сложность алгоритма O(n)


@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое fuzzing-тестирование? Как устроен Fuzzing в Go?

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

Технология полезна, если нужно проверить граничные условия или корректность обработки потока ввода — то есть тогда, когда нужно найти значения, при которых «падает» программа.

В стандартном фреймворке для тестирования есть специальные типы тестов — Test и Benchmark.

В первой конструкции (картинка) мы объявляем фреймворку, в каких случаях тест можно считать успешным, а в каких — провальным. Во второй — фреймворк пытается подобрать такое количество итераций, на котором можно достаточно точно измерить среднее время выполнения одной итерации. По сути, Fuzzing объединяет Test и Benchmark.

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

Вот ключевые моменты, которые важно запомнить для подготовки fuzzing-тестов:

- Название метода нужно записывать через приставку Fuzz — например, FuzzTest, FuzzBug или FuzzFoo. Иначе Go инициализирует обычный unit-тест.

- В качестве параметра необходимо передать указатель на testing.F. Этот параметр нужен, чтобы «связать» тест с кодом программы.

@golang_interview
Вакансия: Golang Developer  Компания: Lamoda Tech
Формат: удаленный или гибридный
Занятость: полная занятость

В Lamoda Tech мы делаем моду ближе для миллионов пользователей. Наша команда совершает цифровую революцию в fashion и e-commerce.

Приглашаем в нашу команду Golang разработчиков!


Основные требования

- опыт коммерческой разработки бэкенда на Golang от 2-х лет;
- опыт работы с SQL базами данных
- умение проектировать API сервисов;
- опыт работы с нереляционными базами данных
- опыт работы с Docker
- опыт работы с Git

Мы предлагаем

- работу в гибридном режиме — можно приезжать в офис или работать из дома
- бесплатные сессии с коучами и психологами
- оплату участия в профессиональных конференциях
- ноутбук и другая необходимая техника для работы
- ДМС с первого месяца, со стоматологией и чек-апом здоровья раз в год;
- Ежемесячные промокоды на Lamoda до 25%;
- офис на Полежаевской с йогой, тренажерным залом и капсулой сна, а также коворкинг в центре Санкт-Петербурга.

Узнать больше
👣 Modern Go Application

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

Github

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM