Всем привет! Сегодня хочу сделать мини обзор на курс 2021 года по языку программирования Go от Специалист уровень 2.

Сам курс идет довольно продолжительное время. Я смотрел его в записи и там было 6 видео по 3 часа каждый.

В данном курсе рассматривается работа с web. Лектор остался тот же, что и на 1-м уровне - Власов Евгений.

Структура курса:

  1. Реализация простого веб сервиса
  2. Аутентификация
  3. Работа с бд
  4. Очень кратко про тестирование
  5. И супер кратко про работу фреймворков

Реализация простого веб сервиса

В данном блоке мы шаг за шагом пытались реализовать веб сервис используя 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.

Всем спасибо за прочтением и всем пока!)