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
加入频道
📌 Задача с Leetcode. Поиск в двумерной матрице

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

Условие задачи: напишите эффективный алгоритм для поиска наличия нужного числа в двумерной матрице, которая имеет следующие свойства:

в строке элементы отсортированы по возрастанию (слева - направо);
в столбце элементы отсортированы по возрастанию (снизу - вверх).

Пример:

Ввод:
matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
Вывод: true

Решение:

func searchMatrix(matrix [][]int, target int) bool {
m, n := len(matrix), len(matrix[0])
i, j := 0, n-1
for i < m && j >= 0 {
if matrix[i][j] == target {
return true
}
if matrix[i][j] < target {
i++
} else {
j--
}
}
return false
}



Временная сложность: O(m + n)
Пространственная сложность: O(1)


Пишите свое решение в комментариях👇

@golang_interview
📌 Тестовое Задание (Golang + PostgreSQL)

Написать сервис, который будет слушать входящие запросы по HTTP, преобразовывать их в запрос к соответствующей функции Postgres, выполнять запрос и возвращать ответ клиенту.

Скиллы: Golang, Postgres, regexp, строки, работа с json в Golang и Postgres.

Web-сервис
Написать сервис, который будет слушать входящие запросы по HTTP, преобразовывать их в запрос к соответствующей функции Postgres (по схеме трансляции, приведённой ниже), выполнять запрос и возвращать ответ клиенту.

Как плюс: ограничить максимальное количество одновременных коннектов к БД.
Как два плюса: добавить prometheus метрики на вызовы (количество вызовов, длительность выполнения).

Настройки соединения с сервером Postgres читать из config файла:
port - (int) порт, на котором слушать запросы
endpoint - (string) название API
host - (string) hostname, где установлен Postgres
user - (string) имя пользователя Postgres
password - (string) пароль пользователя Postgres
schema - (string) схема в Postgres
Трансляция запроса в вызов Postgres функции
Формат запроса к сервису:

HTTP_METHOD server:port/endpoint/vversion[/object/id ...]]/destination/[id] , где

HTTP_METHOD - одно из: GET, POST, PUT, DELETE
server - сервер, где запущен веб-сервис
port - порт
endpoint - значение из config-файла
version - номер версии API, число
/object/id - необязательный повторяющийся параметр, определяющий путь в иерархии объектов
/destination/ - конечный объект
id - id конечного объекта. Обязателен для методов PUT, DELETE, не указывается для POST. Для GET -- если указан, то возвращает элемент с данным id, если не указан, возвращает полный список элементов.
Правила трансляции
запрос в Postgres = select * from схема.[object1[_object2]...]_destination_method( [id1[, id2]... ,] id[, params])

В зависимости от HTTP метода к имени функции добавляется cуффикс method:

для GET - get
для POST - ins
для PUT - upd
для DELETE - del
В случае, если идентификатор объекта не указан, соответствующий элемент id в запросе должен быть равен нулю, на примерах:

для запроса GET http://localhost:80/api/v1/user/12/comment/34
запрос в Postgres должен выглядеть так: select * from test.user_comment_get(12, 34) (комментарий c id=32 пользователя c id=12)
для запроса GET http://localhost:80/api/v1/user/12/comment/
запрос в Postgres должен выглядеть так: select * from test.user_comment_get(12, 0) (все комментарии пользователя 12)
для запроса GET http://localhost:80/api/v1/user/comment/
запрос в Postgres должен выглядеть так: select * from test.user_comment_get(0, 0) (все комментарии всех пользователей)
Для POST и PUT методов в теле запроса принимается JSON, который передаётся в Postgres в качестве параметра params.

Все методы должны возвращать результат работы соответствующей Postgres функции с ContentType = 'application/json'

🖥 Github

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Тестовое задание Advertising

Описание задачи
Необходимо создать сервис для хранения и подачи объявлений. Объявления должны храниться в базе данных. Сервис должен предоставлять API, работающее поверх HTTP в формате JSON.

Метод получения списка объявлений

Пагинация: на одной странице должно присутствовать 10 объявлений;
Cортировки: по цене (возрастание/убывание) и по дате создания (возрастание/убывание);
Поля в ответе: название объявления, ссылка на главное фото (первое в списке), цена.
Метод получения конкретного объявления

Обязательные поля в ответе: название объявления, цена, ссылка на главное фото;
Опциональные поля (можно запросить, передав параметр fields): описание, ссылки на все фото.
Метод создания объявления:

Принимает все вышеперечисленные поля: название, описание, несколько ссылок на фотографии (сами фото загружать никуда не требуется), цена;
Возвращает ID созданного объявления и код результата (ошибка или успех).
Реализация
Следование дизайну REST API.
Подход "Чистой Архитектуры" и техника внедрения зависимости.
Работа с фреймворком echo.
Работа с БД Postgres с использованием библиотеки sqlx и написанием SQL запросов.

Конфигурация приложения - библиотека viper.
Реализация Graceful Shutdown.
Запуск из Docker.
Юнит-тестирование уровней обработчиков, бизнес-логики и взаимодействия с БД классическим способом и с помощью моков - библиотеки testify, mock.
Сквозное (E2E) тестирование - BDD фреймворк goconvey.
Проверка кода на соответствие стандартам с помощью линтера - утилита golangci-lint
Автоматическое создание документации с помощью Swagger 2.0 - библиотека echo-swagger.
Непрерывная интеграция - сборка приложения, проверка линтером и запуск тестов в Github action.
Структура проекта:

.
├── pkg
│ ├── error_message // сообщения об ошибках
│ ├── model // основные структуры
│ ├── handler // обработчики запросов
│ ├── service // бизнес-логика
│ └── repository // взаимодействие с БД
├── cmd // точка входа в приложение
├── migrations // SQL файлы с миграциями
├── scripts // SQL файлы с тестовыми данными
├── configs // файлы конфигурации
├── test // инициализация тестовой БД
└── e2e_test.go // сквозной тест


Архитектура
Приложение имеет 3 основных слоя, реализованных в отдельных пакетах.

Repository - слой взаимодействия с БД. Методы этого слоя принимают данные от Service и выполняют запросы к БД.
Service - слой бизнес-логики. Методы этого слоя принимают данные от Handler и применяют к ним бизнес-правила для достижения цели варианта использования.
Handler - слой обработчиков запросов. Содержит методы-обработчики для endpoints.
Пакет Model содержит структуры сущностей, используемых остальными слоями.

Endpoints
GET /api/adverts - получение списка объявлений
Параметры запроса:
page - номер страницы,
sort - параметры сортировки в формате [поле сортировки]_[порядок сортировки] (например price_desc).
GET /api/adverts/:id - получение объявления по id
Параметры запроса: - fields - флаг, если равен True, то вернуть все поля, иначе вернуть название, ссылку на главное фото и цену.
POST /api/adverts - создание объявления
Тело запроса:
title - название объявления,
description - описание объявления,
photos - ссылки на фотографии,
price - цена.

Задание

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Задача. Слияние двух бинарных деревьев

Сложность: Лёгкая

Условие задачи: Даны два бинарных дерева, необходимо осуществить их наложение друг на друга и вывод результатов в новом дереве.

Примечание: Наложение представляет из себя суммирование соответствующих значений из узлов двух деревьев.

Пример:

Ввод:
root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]
Вывод:
[3,4,5,5,4,null,7]

Ввод:
root1 = [1], root2 = [1,2]
Вывод:
[2,2]

Решение

Пишите свое мнение в комментариях👇

func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
if root1 == nil {
return root2
}

if root2 == nil {
return root1
}

root1.Val += root2.Val
root1.Left = mergeTrees(root1.Left, root2.Left)
root1.Right = mergeTrees(root1.Right, root2.Right)
return root1
}


@golang_interview
👣 Бесплатные курсы по изучению Golang в 2023 году

В этой статье я поделился лучшими бесплатными онлайн-курсами по изучению Golang на таких сайтах, как freeCodecamp, YouTube, Udemy и Coursera .

Читать

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Как создать файл с mimetype golang

Для создания файла с определенным MIME-типом в Go, необходимо создать файл и записать в него данные в нужном формате.

Пример создания файла с MIME-типом text/plain:

package main

import (
"io/ioutil"
"log"
)

func main() {
message := "Hello, world!"

err := ioutil.WriteFile("example.txt", []byte(message), 0644)
if err != nil {
log.Fatal(err)
}
}

В данном примере мы создаем файл example.txt и записываем в него сообщение Hello, world!. Так как тип данных в файле - текстовый, то его MIME-тип будет text/plain.

Пример создания файла с MIME-типом application/pdf:

package main

import (
"io/ioutil"
"log"
)

func main() {
// создаем бинарные данные для PDF-файла
pdfData := []byte{0x25, 0x50, 0x44, 0x46, 0x2d, 0x31, 0x2e, 0x34, ...}

err := ioutil.WriteFile("example.pdf", pdfData, 0644)
if err != nil {
log.Fatal(err)
}
}

В данном примере мы создаем файл example.pdf и записываем в него бинарные данные для PDF-файла. MIME-тип данного файла будет application/pdf.

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

#Junior

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Мои собеседования (Golang developer)

Разработкой начал заниматься ещё со старшей школы, изучал C/C++ (очень пригодилось при написании скриптов в injection для ультимы онлайн). Профессионально начал работать разработчиком приблизительно с 2014, основной язык до 2020 года был C# с примесью C++. Сначала разрабатывал и поддерживал некоторые проекты в банковской сфере, потом резко поменял предметную область и ушёл писать софт для автоматизации работы одного строительного девелопера. На начальных этапах это было огромное легаси на C# от бывшего архитектора, решившего стать программистом, с кучей багов и неочевидных решений, пришлось много переписывать.

Со временем появились задачи, которые не были привязаны к языку и технологиям в принципе (изначально писал, по сути, плагины к CAD-приложениям), и я попробовал Golang, а вместе с ним и микросервисы, NoSQL, gRPC и прочие модные штуки. Побывал в шкуре админа-девопса, так как новые сервисы я запускал и поддерживал сам.

Некоторое время назад наткнулся на пост про собеседования и решил рассказать Хабру про свой опыт. Возможно, кому-то он окажется полезным.

Читать дальше

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Тестовое задание Реализовать REST API на golang

Тестовое задание:

1. Реализовать REST API со следующим функционалом

1.1. Получение курса валют на стороннем API (RUB / EUR / USD / JPY). (например: https://currencyfreaks.com/)
1.1.1. Если за текущий день не было курса, получить в 12:00 обновить курс валют

1.1.2 Реализовать сохранение курса валюты в БД (PostgreSQL, MySQL, Mongo на выбор)

1.2. Реализовать эндпоинты:

1.2.1. Получение курсов по указанной дате (все 4 валюты)

1.2.2. Получение валютных пар из указанных 4х. Т.е. хочу получить курс Рубля к Йене или Доллар к Евро и т.д.

1.3. Реализовать валидацию запросов (даты, тикеров валют)

1.4. Реализовать доступ к API через API key

1.5 Реализовать логирование в БД запросов к API. Сохраняем в логи - дату, вид запроса (по дате / по паре)

1.6. Использовать для проекта docker.

1.7. При инициализации сервера заполнить БД первоначальными данными курсов валют по нескольким датам (значения любые)

#практика

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 15 вопросов с собеседований Golang из LinkedIn Assessment — подробные пояснения

Недавно я наткнулся на тест LinkedIn Golang, интересную возможность для разработчиков получить значок на сайте, демонстрирующий их знание языка (этот значок не только демонстрирует ваши навыки, но и помогает вам выделиться из толпы на конкурентном рынке труда).

Я нашёл вопросы в тесте довольно интересными,

Читать

@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
Вывод всех перестановок символов слайса или строки

Реализуйте функцию perm(), которая принимает слайс или строку и печатает все возможные комбинации символов.

Решение:

package main
import "fmt"

// Perm calls f with each permutation of a.

func Perm(a []rune, f func([]rune)) {
perm(a, f, 0)
}

// Permute the values at index i to len(a)-1.

func perm(a []rune, f func([]rune), i int) {
if i > len(a) {
f(a)
return
}
perm(a, f, i+1)
for j := i + 1; j < len(a); j++ {
a[i], a[j] = a[j], a[i]
perm(a, f, i+1)
a[i], a[j] = a[j], a[i]
}
}

func main() {
Perm([]rune("abc"), func(a []rune) {
fmt.Println(string(a))
})
}


Пишите свое решение в комментариях👇

#junior #golang
@golang_interview
🔥Подборка репозиториев, которые помогут подготовиться к собеседованию:

- System Design Primer
- Interview
- Awesome Interview Questions
- Coding Interview University
- Tech Interview Handbook

#github

@golang_interview
👣 Реализовать брокер очередей в виде веб сервиса. Сервис должен обрабатывать 2 метода:

1. PUT /queue?v=....
положить сообщение в очередь с именем queue (имя очереди может быть любое), пример:
curl -XPUT http://127.0.0.1/color?v=red
curl -XPUT http://127.0.0.1/color?v=green
curl -XPUT http://127.0.0.1/name?v=alex
curl -XPUT http://127.0.0.1/name?v=anna


в ответ {пустое тело + статус 200 (ok)}
в случае отсутствия параметра v - пустое тело + статус 400 (bad request)

2. GET /queue

забрать (по принципу FIFO) из очереди с названием queue сообщение и вернуть в теле http запроса, пример (результат, который должен быть при выполненных put’ах выше):
curl http://127.0.0.1/color => red
curl http://127.0.0.1/color => green
curl http://127.0.0.1/color => {пустое тело + статус 404 (not found)} curl http://127.0.0.1/color => {пустое тело + статус 404 (not found)} curl http://127.0.0.1/name => alex
curl http://127.0.0.1/name => anna
curl http://127.0.0.1/name => {пустое тело + статус 404 (not found)}
при GET-запросах сделать возможность задавать аргумент timeout
curl http://127.0.0.1/color?timeout=N
если в очереди нет готового сообщения получатель должен ждать либо до момента прихода сообщения либо до истечения таймаута (N - кол-во секунд). В случае, если сообщение так и не появилось - возвращать код 404.
получатели должны получать сообщения в том же порядке как от них поступал запрос, если 2 получателя ждут сообщения (используют таймаут), то первое сообщение должен получить тот, кто первый запросил.
Порт, на котором будет слушать сервис, должен задаваться в аргументах командной строки.

Запрещается пользоваться какими либо сторонними пакетами кроме стандартных библиотек. (задача в написани кода, а не в использовании чужого)

Желательно (но не обязательно) весь код расположить в одном go-файле (предполагается, что решение будет не больше 200 строк кода) для удобства проверки, никаких дополнительных файлов readme и т.п. не требуется, создание классической структуры каталогов (cmd/internal/...) не требуется.

Лаконичность кода будет восприниматься крайне положительно, не нужна "гибкость" больше, чем требуется для решения именно этой задачи, не нужны логи процесса работы программы (только обработка ошибок), никакого дебага и т.д... чем меньше кода - тем лучше!

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


@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
3 ошибки на собеседованиях по программированию, из-за которых можно получить отказ

Собеседование по программированию  —  сложное испытание, требующее тщательной подготовки. От вас ждут определённых знаний и навыков, а также способности относительно быстро решать разные задачи.

Но иногда с решением тестовых задач могут возникать сложности, которые приведут к отказу. О 3 ошибках, которые допускают кандидаты во время решения тестовых задач узнаете тут:

https://nuancesprog.ru/p/16911/
📚Книга: 100 Go Mistakes and How to Avoid Them (2022)

Книга рекомендуется к прочтению Go-разработчиками перед тем, как приступить к кодингу. Эта книга поможет:

— Избежать самые распространенные ошибки
— Структурировать и оптимизировать код
— Эффективно обрабатывать данные и управляющие структуры
— Работать с ошибками в идиоматической манере
— Подготовить приложение к проду и улучшить качество тестирования
— Улучшить навыки работы с конкурентностью и многое другое

книга
исходные коды

@golang_interview
👣 Разобр 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