Библиотека Go для собеса | вопросы с собеседований
Відкрити в Telegram
Вопросы с собеседований по Go и ответы на них. Учиться у нас: clc.to/iEeaZw По рекламе: @proglib_adv Для обратной связи: @proglibrary_feeedback_bot Наши каналы: https://t.me/proglibrary/9197
Показати більше7 428
Підписники
+424 години
+97 днів
-1030 день
Архів дописів
💬 Допустимо ли возвращать ответ "HTTP 200 OK", когда на стороне сервера произошла ошибка (сведения об ошибке будут содержаться внутри тела ответа)?
Допустимо для ошибок бизнес-логики приложения, однако в большинстве случаев это зависит от конкретного юзкейса.
Статус "200 OK" зачастую используется только тогда, когда запрос был успешно обработан и результаты этой обработки соответствуют ожиданиям клиента.
В случае возникновения ошибки следует использовать соответствующие статусы ответа HTTP, которые точно отражают природу проблемы. Например:
🔹
500 Internal Server Error — для неустранимых ошибок на стороне сервера.
🔹 503 Service Unavailable — если сервер временно недоступен, например, из-за перегрузки или технического обслуживания.
🔹 400 Bad Request — если ошибка возникла из-за некорректных данных, предоставленных клиентом.
🔹 404 Not Found — если запрос был направлен на несуществующий ресурс.
🔗 Все коды состояния ответа HTTP
🔗 Обсуждение на StackOverflowЕсли ты — golang-разработчик и страдаешь от недостатка профильных конференций, у нас для тебя клевая новость. Уже 13 мая стартует новый сезон Podlodka Go Crew с темой «базы данных». Мы в Podlodka организовываем онлайн-конференции по разным секциям разработки, так что тебе не придётся куда-то ехать. Все знания получишь прямо у экрана своего монитора.
⭐️ Научимся сравнивать библиотеки и ORM вместе с Арсеном Абдусаламовым из Авито. Познакомимся с решениями как можно подключаться к базам данных и узнаем про «Go way» способ.
⭐️ Попрактикуемся обращаться с распределённым MySQL с помощью Vitess вместе с Ильёй Ушаковым. Ведь одного инстанса MySQL в какой-то момент может начать не хватать. Что же делать, если переходить на NoSQL совсем неохота? Vitess — ответ на этот вопрос, золотая середина между NoSQL distributed базами данных и проверенным опытом MySQL.
⭐️ Узнаем всё о продвинутых структурах данных в Redis вместе с Олегом Арутюновым из Контура. Углубимся в преимущества и недостатки подхода, разберёмся с миграциями данных и оптимизацией базы.
⭐️ Мокать или предзаполнять базы данных? На этот вопрос ответят спикеры из Ozon Fintech. И это будет не просто доклад, а баттл: не на жизнь, а на смерть. Разберёмся, когда какой подход выбрать и стоит ли ограничиваться только одним.
🎁Бонус: публичный собес по работе с PostgreSQL. И это, естественно, не все сессии сезона.
Залетай за билетом, чтобы не пропустить специализированную конференцию для Golang-разработчиков
Реклама. ИП Толстая Елена Петровна
💬 Как использовать 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. Это позволяет сохранить неизменным первоначальный поток данных запроса для дальнейшей обработки в последующих обработчиках.💬 Как в Go отформатировать строку без её вывода?
С использованием функции
fmt.Sprintf. Она работает аналогично fmt.Printf, но вместо вывода результата в стандартный вывод, она возвращает отформатированную строку.
Мы можем использовать fmt.Sprintf для создания строк с переменными или сложными форматами, которые затем могут быть использованы в коде или сохранены для последующего использования.🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
+3
💬 Для каких целей могут использоваться функции с префиксом 'Must'?
Функции с префиксом "Must" ("must") предупреждают, что они могут вызвать панику, если что-то пойдет не так. Они часто используются для:
🔹 Инициализации задач, которые не должны завершаться неудачей, например, настройка глобальных переменных в начале приложения, настройка регулярных выражений, подключение к базам данных и т. д.
🔹 В кейсах тестирования они позволяют немедленно завершить тест с помощью
t.Fatal, если что-то идет не так.
Функции Must упрощают обработку ошибок в конкретных контекстах, но их следует использовать осторожно, чтобы избежать нежелательной паники.Repost from Библиотека ИИ для айтишников
😉 55 промтов для ChatGPT, которые помогут подготовиться к собеседованию
Вы когда-нибудь задумывались, как можно использовать искусственный интеллект для того, чтобы подготовиться к техническим собеседованиям лучше, быстрее и эффективнее? Мы вот — да! И поэтому подготовили 55 промтов, которые помогут сделать это.
В статье собраны шаблоны запросов, которые желательно «докрутить» под себя.
🔗 Читать статью
🔗 Зеркало
Repost from Библиотека Go-разработчика | Golang
🏃 🏃 🏃 Самоучитель по 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. Обработка ошибок. Паника. Восстановление. Логирование
💬 Что такое Profile-guided optimization и для чего она предназначена?
Profile-guided optimization (PGO) — это представленная в Go 1.21 (анонсирована в Go 1.20 preview) техника оптимизации компилятора, которая использует данные о профиле выполнения программы, чтобы улучшить качество генерируемого исполняемого кода.
📌 PGO работает в два этапа:
1. Сбор данных: первоначально программа компилируется с включением инструментов профилирования, которые собирают информацию о частоте и условиях выполнения различных частей кода во время выполнения.
2. Оптимизация: на основе этих данных программа повторно компилируется, при этом компилятор использует информацию о профиле для выполнения оптимизаций.
Преимущества PGO включают улучшение производительности программы, так как оптимизации делают исполняемый код более приспособленным к реальным кейсам использования. Это особенно важно в приложениях, где критически важна производительность.
👉 Подробнее
Repost from Библиотека Go-разработчика | Golang
👩💻 Функция
Join пакета errors конкатенирует список ошибок и возвращает ошибку, если хотя бы одна из переданных ошибок не nil.
Join возвращает nil, если все переданные ошибки равны nil.
#tip by Golangbot🦾🧠🏋️Качаем мозги к лету!
Курс «Алгоритмы и структуры данных» для тех, кто хочет научиться работать с алгоритмами, подготовиться к собеседованию крупную IT-компанию и начать брать более сложные проекты.
➡️ Алгоритмы и структуры данных 35 990 ₽ 21 594 ₽
⭐️ Переходите и активируйте бесплатные вводные занятия курса — https://proglib.io/w/da6727d1
Вас ждут:
– 150 практических заданий и 47 видеолекций
– бессрочный доступ к обучению
– поддержка преподавателя в чате
А также очень харизматичный спикер из Яндекса 🙌🏻
+3
💬 Как использовать буферизированные каналы в качестве семафоров для ограничения выполнения горутин?
Когда нам нужно управлять тем, сколько горутин могут одновременно получить доступ к ресурсу, использование семафора является надежным подходом.
Мы можем создать семафор, используя буферизированный канал, где размер канала определяет, сколько горутин могут работать одновременно.
Вот что происходит:
🔹 Горутина отправляет значение в канал, занимая один слот.
🔹 После выполнения своей задачи она удаляет значение, тем самым освобождая этот слот для другой горутины.
В примере:
🔹
wg.Add(10): готовимся к завершению задач 10 горутинами.
🔹 make(chan struct{}, 3): создает семафор, который позволяет одновременно работать только трем горутинам.
☑️ Если нам нужен более чистый способ, мы могли бы создать тип Semaphore, который обрабатывает все действия, связанные с семафором.
☑️ Использование кастомного типа Semaphore упрощает управление доступом к ресурсам в наших функциях.
☑️ Также существует реализация семафора в пакете golang.org/x/sync/semaphore. Он позволяет горутине использовать более одного слота, что полезно в сценариях, где задачи различаются по потреблению ресурсов.Repost from Библиотека Go-разработчика | Golang
💡
io.TeeReader можно использовать для копирования содержимого одного ридера в новый. Этот метод полезен, когда тело HTTP-запроса нужно прочитать дважды.
👉 Юзкейс: логирование входящих запросов с помощью middleware перед обработкой запросов.
#tip by Golangbot💬 Что такое микросервисная архитектура?
Микросервисная архитектура — распространенный подход к разработке ПО, когда приложение разбивается на небольшие автономные компоненты (микросервисы) с четко определенными интерфейсами.
Каждый отдельный сервис выполняет определённую функцию и общается с другими сервисами через API. Эти сервисы обычно разрабатываются, развёртываются и управляются независимо друг от друга.
💬 Что такое RPC и как Go его поддерживает.
Remote Procedure Call (удаленный вызов процедур) — протокол взаимодействия между клиентом и сервером, который позволяет клиенту вызывать процедуры (функции, методы) на удаленном сервере, как если бы они были локальными.
Это обеспечивает абстракцию взаимодействия по сети и позволяет программам работать в распределенной среде, скрывая сложности передачи данных и выполнения удаленных операций.
Go имеет поддержку RPC через пакеты стандартной библиотеки, в первую очередь net/rpc и net/rpc/jsonrpc.
💬 Для чего предназначена директива go:generate?
Директива
go:generate используется для автоматизации генерации кода или других команд, которые должны выполняться перед сборкой пакета.
Она служит инструкцией для инструмента go generate, который нужно запустить вручную или как часть сценария сборки. Пример использования go:generate может включать генерацию моков для тестирования, предварительную обработку или создание дополнительных исходных файлов на основе шаблонов.
📌 Пример использования:
//go:generate mockgen -destination=mocks/mock_myinterface.go -package=mocks my/package MyInterface
Здесь go:generate указывает инструменту go generate выполнить команду mockgen для создания мок-версии интерфейса MyInterface.💬 Что такое procfs и sysfs в контексте ОС Linux?
🔹 procfs, или файловая система proc, является важным компонентом для мониторинга и управления процессами в ОС Linux. Она предоставляет динамический интерфейс к структурам данных ядра. Каждый запущенный процесс в системе представлен директорией в
/proc с соответствующим PID как именем этой директории.
Внутри каждой такой директории можно найти файлы и ссылки, предоставляющие информацию о состоянии процесса и позволяющие в некоторых случаях изменять параметры работы процесса. Например, файл /proc/[pid]/status содержит информацию о состоянии процесса, его памяти, приоритете и другие важные данные.
🔹 sysfs, или файловая система sys, используется для представления и управления информацией о драйверах и устройствах, которые присутствуют в системе. Эта файловая система структурирована по типам устройств и подсистемам, что делает её особенно удобной для получения информации о конфигурации оборудования и управления.
Например, через файлы в /sys/class/gpio/ можно управлять GPIO пинами на устройствах, поддерживающих это. sysfs также используется для настройки параметров устройств, например, изменения яркости экрана или управления питанием.Repost from Библиотека ИИ для айтишников
Призи розіграшу
10 підписок Telegram Premium на 3 місяців
Дата завершення
💬 Можно ли утверждать, что после уменьшения размера среза в Go память, занимаемая оставшимися элементами, будет освобождена?
Срез состоит из трех компонентов: указателя на начало среза в массиве, длины среза и его емкости. Емкость среза указывает на максимальное количество элементов, которое срез может вместить, не требуя перераспределения памяти.
Когда мы уменьшаем размер среза, (например,
s[:n], где n меньше текущей длины среза s), мы изменяем только длину среза, но не его емкость. Память, связанная с емкостью среза, остается выделенной, поскольку базовый массив, к которому срез имеет доступ, остается неизменным.
Это означает, что элементы, которые находятся за пределами новой длины, но в пределах емкости среза, технически все еще занимают память и могут быть доступны при расширении среза до его первоначальной емкости.
Таким образом, GC очистит память старого массива (если на него не будут указывать другие срезы) только после реалокации памяти и переноса значений в новый срез.🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
