Эта статья посвящена ремонтопригодности кода модульного тестирования, не знаю, писали ли вы когда-нибудь модульный тест в spaghetti-style, который структурирован похожим образом. Честно говоря, я написал довольно много.
func TestFoo(t *testing.T) {
// test get
resp, err := GET(blabalbal)
assert.Nil(err)
...
// test post
resp, err = POST(blabalbal)
assert.Nil(err)
...
// test update
resp, err = PUT(blabalbal)
assert.Nil(err)
...
}
Большинство людей это пишут для удобства: для инициализации переменных и их повторного использования. Но когда код варианта использования слишком длинный, а единственный текст завершается неудачей, трудно найти конкретную причину, а ее поиск занимает много времени при отладке.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1🔥1
Большинство современных программных систем имеют микросервисную архитектуру. Для стека микросервисных технологий Spring Cloud характерно содержание в прикладной системе нескольких прикладных микросервисов.
Перед запуском приложения необходимо запустить шлюз, центр регистрации, центр конфигурации, базу данных (даже при наличии внедренного в систему межплатформенного ПО, такого как Redis, RabbitMQ, системы управления логами ELK, системы визуализации Grafana и других сервисов).
При развертывании приложения с микросервисной архитектурой необходимо упаковать разработанный сервис Spring Boot в образ Docker, импортировать его в Docker, а затем запустить развертывание.
Межплатформенное ПО, база данных и другие сервисы также должны получить соответствующую версию образа из удаленного хранилища Docker для развертывания. Это довольно громоздкий процесс, занимающий много времени.
Уменьшить рабочую нагрузку позволяет использование Docker Compose — официального инструмента оркестрации контейнеров, предоставляемого компанией Docker.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👎2❤1🔥1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Сам проект кроссплатформенный, а также имеет открытое API для создания плагинов
#Go #Terminal
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥4❤1😁1
Наиболее распространенным способом обработки ошибок в gRPC является прямой возврат ошибки, например, return nil, err, но на практике также у нас есть коды бизнес-статуса для возврата, и распространенным способом является определение кода ошибки в возвращаемой структуре, но очень громоздко для записи, например, вам придется написать это так.
user, err := dao.GetUserByEmail(ctx, email)
if err != nil {
if err == gorm.RecordNotFound {
return &GetUserResp{Code: USER_NOT_FOUND, Msg: "user not found"}, nil
}
return nil, err
}
Здесь присутствует несколько проблем:
- возвращающие ошибки - это боль при написании, потому что вам нужно каждый раз определять ошибку, а затем преобразовывать ее в соответствующий код ошибки в полях Code, Msg.
- если вы вернете err напрямую, вместо самоопределяемых grpc codes.NotFound, ошибка не может быть распознана в клиенте.
- если вы используете шлюз, любая ошибка, которая не является пользовательской ошибкой grpc, будет указана как 500.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20👎3❤1🔥1
Forwarded from Golang вопросы собеседований
#практика
Необходимо реализовать сервис, позволяющий следить за изменением цены любого объявления на Авито (другой аналогичный сайт с объявлениями):
1. Сервис должен предоставить HTTP метод для подписки на изменение цены. На вход метод получает - ссылку на объявление, email на который присылать уведомления.
2.После успешной подписки, сервис должен следить за ценой объявления и присылать уведомления на указанный email.
3. Если несколько пользователей подписались на одно и тоже объявление, сервис не должен лишний раз проверять цену объявления.
Требования к решению
- Необходимо проработать архитектуру сервиса и описать принципиальную схему работы в виде текста и/или диаграмм.
- Приложить фрагменты кода, решающие конкретные задачи:
- Подписка на изменение цены
- Отслеживание изменений цены
- Отправка уведомления на почту
Работа с БД
- Язык программирования Golang.
Чтобы получить цену объявления, можно:
- парсить web-страницу объявления
- самостоятельно проанализировать трафик на мобильных приложениях или мобильном сайте и выяснить какой там API для получения информации об объявлении
Усложнения
- Реализовать полноценный сервис, который решает поставленную задачу (сервис должен запускаться в docker-контейнере).
- Написаны тесты (постарайтесь достичь покрытия в 70% и больше).
- Подтверждение email пользователя.
Ставьте ❤️, если вам интересно увидеть практические задания с реальных собеседований.
@golang_interview
Please open Telegram to view this post
VIEW IN TELEGRAM
❤127👍5🔥2🤬1
Тестовое задание для кандидата на должность Golang разработчика.
Описание
Есть внешний сервис, который обрабатывает некие абстрактные объекты батчами. Данный сервис может обрабатывать только определенное количество элементов n в заданный временной интервал p. При превышении ограничения, сервис блокирует последующую обработку на долгое время.
Задача заключается в реализации клиента к данному внешнему сервису, который позволит обрабатывать максимально возможное количество объектов без блокировки. Приводить реализацию внешнего сервиса необязательно!
Определение сервиса:
package main
import (
"context"
"errors"
"time"
)
// ErrBlocked reports if service is blocked.
var ErrBlocked = errors.New("blocked")
// Service defines external service that can process batches of items.
type Service interface {
GetLimits() (n uint64, p time.Duration)
Process(ctx context.Context, batch Batch) error
}
// Batch is a batch of items.
type Batch []Item
// Item is some abstract item.
type Item struct{}
Требования
- язык программирования Golang.
- решение должно быть в git-репозитории (можно прислать архив или опубликовать на github, gitlab, bitbucket...).
Пожелания
- документирование кода;
- тесты;
- использование статического анализатора (конфигурацию положить в репозиторий).
Варианты решений можно присылать в комментарии.
❤️, если нравится такие задачи.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
❤53👍6🔥2
Gitea – инструмент, который позволяет развернуть self-hosted git-сервис на подобии github или gitlab
Поскольку Gitea написана на Go, она работает на всех платформах и архитектурах, поддерживаемых Go, включая Linux, macOS и Windows на архитектурах x86, amd64, ARM и PowerPC
#Go #Git #Useful
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥2❤1
Asynq – простая, надежная и эффективная очередь задач в Go
Обзор работы Asynq:
• Клиент ставит задачи в очередь
• Сервер извлекает задачи из очередей и запускает рабочую рутину для каждой задачи
• Задачи обрабатываются одновременно несколькими «обработчиками»
Очереди задач используются в качестве механизма распределения работы между несколькими машинами.
Работает с Redis.
#Go #Task #Queue
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤3🔥2
Если вы прочитали заголовок и подумали «ну, ты, наверно, сделал сначала что-то глупое», то вы правы! Но что такое программирование, как не упражнения в глупых ошибках? Поиск глупых ошибок — это и есть самое большое удовольствие!
Также стоит заранее сделать оговорку о бенчмаркинге: ускорение на 42% было замерено при выполнении программы с моими данными и на моём компьютере, поэтому относитесь к этому результату с долей скепсиса.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3👎3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Вам понравится, если вся необходимая информация, связанная с работой Docker, будет в одном окне терминала? Вероятно, да, а значит Lazydocker вам более чем подходит. Этот клиент помимо сбора всей информации в одной месте (images, containers и т.д.), позволяет просматривать логи, производить любые манипуляции с контейнерами и многое другое.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24😱4🔥2❤1
Протокол HTTP - это протокол прикладного уровня, который обычно реализовывался на основе протокола TCP до HTTP/3. Поскольку протокол TCP является надежным протоколом потоковой связи, после установления соединения как отправители, так и получатели могут отправлять данные любой длины, и стек TCP также может выполнять нарезку данных. Таким образом, протоколы прикладного уровня на основе TCP должны согласовывать формат передачи сообщений, чтобы как отправители, так и получатели могли извлечь полное сообщение из принятого потока данных. Протокол HTTP - это одно из многих соглашений. Короче говоря, TCP - это протокол транспортного уровня, который обеспечивает потоковую связь, а HTTP определяет формат сообщения.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥7❤3
Devzat – реализация чата по SSH
Поскольку приложения SSH есть буквально на всех платформах, даже на вашем телефоне, вы можете подключиться к Devzat на любом устройстве.
Интересные особенности:
• Различные комнаты!
• Поддержка markdown! Таблицы, заголовки, курсив и все такое
• Подсветка синтаксиса кода
#Go #SSH #Interesting #Useful
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥2❤1👎1
Awesome-Web-Scraping – Список инструментов, библиотек программирования и веб-сервисов, используемых при парсинге и обработке данных.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3❤1
This media is not supported in your browser
VIEW IN TELEGRAM
bit – Экспериментальная имплементация надстройки на git cli на Go
Данный инструмент предоставляет следующие улучшения:
• автокомплит команд;
• автокомплит имен файлов;
• автоматический фетч и механизм, снижающий вероятность конфликтов;
• и др.
#Go #Git #CLI #Interesting
🖥 GitHub
@Golang_google
Данный инструмент предоставляет следующие улучшения:
• автокомплит команд;
• автокомплит имен файлов;
• автоматический фетч и механизм, снижающий вероятность конфликтов;
• и др.
#Go #Git #CLI #Interesting
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤3🔥3👎1
Go-app — это пакет для создания прогрессивных веб-приложений (PWA) с помощью языка программирования Go (Golang) и WebAssembly (Wasm).
go mod init
go get -u github.com/maxence-charriere/go-app/v9/pkg/app
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤3🔥2🤔1
Gomo — это многомодульный инструмент Simple Golang.
brew install abdfnx/tap/gomo
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2❤1
Все best practices по написанию программ в одном месте. Удобно, что есть не только примеры «хорошего» кода, но и антипаттерны. Вместе с ними — грамотные объяснения, почему не стоит использовать ряд подходов при проектировании программ.
Гайд по написанию кода и оформили его внутри GitHub-репозитория. Большая часть материалов переведена на русский язык.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🔥2❤1
Дано: два неупорядоченных среза.
а) a := []int{37, 5, 1, 2} и b := []int{6, 2, 4, 37}.
б) a = []int{1, 1, 1} и b = []int{1, 1, 1, 1}.
Верните их пересечение.
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2❤1
go-callvis — это инструмент разработки, помогающий удобно визуализировать вызовы программы Go. Это особенно полезно в больших проектах, где сложность кода намного выше, или когда вы просто пытаетесь понять чужой код.
go get -u github.com/ofabry/go-callvis
# or
git clone https://github.com/ofabry/go-callvis.git
cd go-callvis && make install
@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥4❤3