Библиотека Go для собеса | вопросы с собеседований
6.88K subscribers
221 photos
6 videos
1 file
428 links
Вопросы с собеседований по Go и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/0b524a15

Для обратной связи: @proglibrary_feeedback_bot

Наши каналы: https://t.me/proglibrary/9197
Download Telegram
💬 Что такое RPC и как его поддерживает Go?

Remote Procedure Call (удаленный вызов процедур) — технология взаимодействия между клиентом и сервером, которая позволяет клиенту вызывать процедуры (функции, методы) на удаленном сервере, как если бы они были локальными.

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

Go имеет поддержку RPC через пакеты стандартной библиотеки, в первую очередь net/rpc и net/rpc/jsonrpc.
👍4🤔2
💬 Что такое микросервисная архитектура?

Микросервисная архитектура — распространенный подход к разработке ПО, когда приложение разбивается на небольшие автономные компоненты (микросервисы) с четко определенными интерфейсами.

Каждый отдельный сервис выполняет определённую функцию и общается с другими сервисами через API. Эти сервисы обычно разрабатываются, развёртываются и управляются независимо друг от друга.
👍5
💡 io.TeeReader можно использовать для копирования содержимого одного ридера в новый. Этот метод полезен, когда тело HTTP-запроса нужно прочитать дважды.

👉 Юзкейс: логирование входящих запросов с помощью middleware перед обработкой запросов.

#tip by Golangbot
🔥17
💬 Как использовать буферизированные каналы в качестве семафоров для ограничения выполнения горутин?

Когда нам нужно управлять тем, сколько горутин могут одновременно получить доступ к ресурсу, использование семафора является надежным подходом.

Мы можем создать семафор с использованием буферизированного канала, где размер канала определяет, сколько горутин могут работать одновременно.

Вот что происходит:

🔹 Горутина отправляет значение в канал, занимая один слот.
🔹 После выполнения своей задачи она удаляет значение, тем самым освобождая этот слот для другой горутины.

В примере:

🔹 wg.Add(10): готовимся к завершению задач 10 горутинами.
🔹 make(chan struct{}, 3): создает семафор, который позволяет одновременно работать только трем горутинам.

☑️ Если нам нужен более чистый способ, мы могли бы создать тип Semaphore, который обрабатывает все действия, связанные с семафором.
☑️ Использование кастомного типа Semaphore упрощает управление доступом к ресурсам в наших функциях.
☑️ Также существует реализация семафора в пакете golang.org/x/sync/semaphore. Он позволяет горутине использовать более одного слота, что полезно в сценариях, где задачи различаются по потреблению ресурсов.
👍23
🦾🧠🏋️Качаем мозги к лету!

Курс «Алгоритмы и структуры данных» для тех, кто хочет научиться работать с алгоритмами, подготовиться к собеседованию крупную IT-компанию и начать брать более сложные проекты.

➡️ Алгоритмы и структуры данных 35 990 ₽ 21 594

⭐️ Переходите и активируйте бесплатные вводные занятия курсаhttps://proglib.io/w/da6727d1

Вас ждут:

– 150 практических заданий и 47 видеолекций

– бессрочный доступ к обучению

– поддержка преподавателя в чате

А также очень харизматичный спикер из Яндекса 🙌🏻
🥱3
👩‍💻 Функция Join пакета errors конкатенирует список ошибок и возвращает ошибку, если хотя бы одна из переданных ошибок не nil.

Join возвращает nil, если все переданные ошибки равны nil.

#tip by Golangbot
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍5
💬 Что такое Profile-guided optimization и для чего она предназначена?

Profile-guided optimization (PGO) — это представленная в Go 1.21 (анонсирована в Go 1.20 preview) техника оптимизации компилятора, которая использует данные о профиле выполнения программы, чтобы улучшить качество генерируемого исполняемого кода.

📌 PGO работает в два этапа:

1. Сбор данных: первоначально программа компилируется с включением инструментов профилирования, которые собирают информацию о частоте и условиях выполнения различных частей кода во время выполнения.

2. Оптимизация: на основе этих данных программа повторно компилируется, при этом компилятор использует информацию о профиле для выполнения оптимизаций.

Преимущества PGO включают улучшение производительности программы, так как оптимизации делают исполняемый код более приспособленным к реальным кейсам использования. Это особенно важно в приложениях, где критически важна производительность.

👉 Подробнее
👍6🔥5
🏃 🏃 🏃 Самоучитель по Go для начинающих. Часть 12. Обобщенное программирование. Дженерики

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


👉 Читать гайд

📌 Остальные части в серии:

1. Особенности и сфера применения Go, установка, настройка
2. Ресурсы для изучения Go с нуля
3. Организация кода. Пакеты, импорты, модули. Ввод-вывод текста.
4. Переменные. Типы данных и их преобразования. Основные операторы
5. Условные конструкции if-else и switch-case. Цикл for. Вложенные и бесконечные циклы
6. Функции и аргументы. Области видимости. Рекурсия. Defer
7. Массивы и слайсы. Append и сopy. Пакет slices
8. Строки, руны, байты. Пакет strings. Хеш-таблица (map)
9. Структуры и методы. Интерфейсы. Указатели. Основы ООП
10. Введение в ООП. Наследование, абстракция, полиморфизм, инкапсуляция
11. Обработка ошибок. Паника. Восстановление. Логирование
👍7
😉 55 промтов для ChatGPT, которые помогут подготовиться к собеседованию

Вы когда-нибудь задумывались, как можно использовать искусственный интеллект для того, чтобы подготовиться к техническим собеседованиям лучше, быстрее и эффективнее? Мы вот — да! И поэтому подготовили 55 промтов, которые помогут сделать это.

В статье собраны шаблоны запросов, которые желательно «докрутить» под себя.

🔗 Читать статью
🔗 Зеркало
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
💬 Для каких целей могут использоваться функции с префиксом 'Must'?

Функции с префиксом "Must" ("must") предупреждают, что они могут вызвать панику, если что-то пойдет не так. Они часто используются для:

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

Функции Must упрощают обработку ошибок в конкретных контекстах, но их следует использовать осторожно, чтобы избежать нежелательной паники.
👍11🤔21
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
💬 Как в Go отформатировать строку без её вывода?

С использованием функции fmt.Sprintf. Она работает аналогично fmt.Printf, но вместо вывода результата в стандартный вывод, она возвращает отформатированную строку.

Мы можем использовать fmt.Sprintf для создания строк с переменными или сложными форматами, которые затем могут быть использованы в коде или сохранены для последующего использования.
🥱17👍5
💬 Как использовать io.TeeReader в Go для логирования содержимого HTTP-запроса перед его обработкой? Каковы потенциальные преимущества и ограничения такого подхода?

io.TeeReader в Go используется для одновременного чтения данных из io.Reader и копирования этих данных в io.Writer. Это особенно полезно при логировании содержимого HTTP-запросов в мидлваре, позволяя одновременно читать и логировать данные, не теряя их для последующей обработки.

Преимущества использования io.TeeReader включают возможность прозрачного логирования данных запроса без изменения основного потока чтения данных. Ограничение заключается в том, что использование io.TeeReader может привести к незначительному увеличению задержек из-за дополнительной операции записи во время чтения данных.

📌 Простой пример:

package main

import (
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"strings"
)

func logRequestData(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Создание буфера для логирования данных запроса
var buf strings.Builder
teeReader := io.TeeReader(r.Body, &buf)

// Чтение и логирование содержимого запроса
body, err := ioutil.ReadAll(teeReader)
if err != nil {
http.Error(w, "Ошибка при чтении тела запроса", http.StatusInternalServerError)
return
}

// Запись данных обратно в тело запроса для последующей обработки
r.Body = ioutil.NopCloser(strings.NewReader(buf.String()))

// Вывод тела запроса в лог
log.Printf("Received request with body: %s", body)

// Продолжение обработки запроса
next.ServeHTTP(w, r)
})
}

func mainHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Запрос обработан")
}

func main() {
finalHandler := http.HandlerFunc(mainHandler)
http.Handle("/", logRequestData(finalHandler))
log.Println("Сервер запущен на порту 8080")
http.ListenAndServe(":8080", nil)
}


В примере мы создаем мидлваре, которая использует io.TeeReader для чтения тела HTTP-запроса, одновременно логируя его в stdout. Это позволяет сохранить неизменным первоначальный поток данных запроса для дальнейшей обработки в последующих обработчиках.
🔥5👍3
💬 Допустимо ли возвращать ответ "HTTP 200 OK", когда на стороне сервера произошла ошибка (сведения об ошибке будут содержаться внутри тела ответа)?

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

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

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

🔹 500 Internal Server Error — для неустранимых ошибок на стороне сервера.
🔹 503 Service Unavailable — если сервер временно недоступен, например, из-за перегрузки или технического обслуживания.
🔹 400 Bad Request — если ошибка возникла из-за некорректных данных, предоставленных клиентом.
🔹 404 Not Found — если запрос был направлен на несуществующий ресурс.

🔗 Все коды состояния ответа HTTP
🔗 Обсуждение на StackOverflow
5