Всем привет! Сегодня хочу сделать мини обзор на курс 2021 года по языку программирования Go от Специалист уровень 2.
Сам курс идет довольно продолжительное время. Я смотрел его в записи и там было 6 видео по 3 часа каждый.
В данном курсе рассматривается работа с web. Лектор остался тот же, что и на 1-м уровне - Власов Евгений.
Структура курса:
- Реализация простого веб сервиса
- Аутентификация
- Работа с бд
- Очень кратко про тестирование
- И супер кратко про работу фреймворков
Реализация простого веб сервиса
В данном блоке мы шаг за шагом пытались реализовать веб сервис используя mux библиотеку. Немного поговорили про шаблоны проектов и в результате предложили использовать project layout который есть на github.
Таким образом, пока лектор реализовывал веб сервис, он старался придерживаться данного шаблона, хотя были некоторые спорные вопросы относительно папки Storage, которая в свою очередь хранит в себе структуру для работы с БД.
Вообще, весь сервис это супер простой CRUD в которой нету никакой логики. Просто перегоняем JSON туда и обратно.
Аутентификация
Добавили в проект аутентификацию по JWT токену. Использовали для этого стороннии библиотеки.
В итоге на курсе рассказали, что такое middleware и как его использовать для аутентификации. Интересно, но довольно коротко.
Работа с БД
В данном курсе лектор работал с Postgresql. Показали как подключится к БД, а так же как с помощью драйверов выполнять SQL запросы. Однако было пару вопросов по коду.
Работа репозиториев
Лектор создал глобальную структуру Storage в которой была ссылка на DB. После он создал 2 репозитория для работы с 2мя сущностями и добавил на них ссылки
type Storage struct {
db *DB
UserRepo *UserRepository
ArticleRepo *ArticleRepository
}
На первый взгляд все более или менее нормально, но вопрос у меня возник при создании структур репозиториев:
type UserRepository struct {
storage *Storage
}
Вот тут я вообще не понял. Лектор пояснял, что так проще сразу добраться до DB, тут спору нет. Однако мы так же можем спокойно обратится и к ArticleRepo.
Возможно я чего то не понял или лектору просто было лень придумывать более лаконичное решение. Но репозиторий не должен знать о других репозиториях, у него только одна задача - работать со своей сущностью. А если мы захотим взаимодействовать с несколькими сущностями, то мы делаем какой либо микс в другом репозитории, где своя логика для работы с несколькими из них.
Либо же, мы просто уже на уровне бизнес логики, манипулируем несколькими репозиториями. В общем, мне кажется нужно было как-то прокинуть именно ссылку на саму DB в репозиторий, а не весь сторедж.
Работа Select
В репозиториях были все CRUD операции, но в тупик меня поставила работа метода GetAll.
Сама реализация этого метода была очень проста. Мы просто селектим табличку и все. Вроде все ок и у меня вопросов к этому нету.
Однако, вопрос появляется в местах, где мы ищем сущность по ID.
Прикол в том, что лектор вызывал этот GetAll и перебирал его, что бы найти то что нужно:
func (u *UserRepository) FindById(id int) (*User, error) {
... какие-то проверки
users, err := u.GetAll()
... err проверка ....
for user := range users {
if user.Id == id {
return ...
}
}
...
}
В общем, проблема в том. что он так делал во всех методах. Update, delete и т.д. Проблема в том, что он говорил, что так делать нормально. После этого я просто не мог поверить своим ушам. Человек вроде образованный и постоянно говорил хорошие вещи. Но почему-то он научил людей именно такой реализиации. А что если потом кто-то из них будет делать такой же запрос, только там будет 1000000 сущностей. И таких запросов будет под 1000 в секунду. Да они же всю оперативную память съедят.
В конечном счете, можно было бы просто сделать запрос с where и проблем бы не было.
Тестирование
Тут особо говорить не о чем. Тему тестирования задели в последнем уроке, в перовой половине лекции.
Просто написали функцию факториала и сделали к ней тест. Дальше очень быстро сделали к ней API и сделали тест к этой API.
В общем, очень кратко и очень сжато.
Фреймворки
На работу с ними отвели конец последней лекции.
Очень быстро накидали проект который реализовывали без фреймворков, только mux заменили на GIN, а SQL запросы в репозиториях заменили на GORM.
Итог
Курс подойдет как простой показ того, как вообще происходит работа с вебом. От туда можно вынести парочку знаний для себя, но таких простых на работе нету. Да и никто не пишет так.
В общем этот курс стоит рассматривать, как введение в web разработку на GO.
Всем спасибо за прочтением и всем пока!)